|
|
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Хорошего дня! Коллеги, тут юзеры поставили задачку: нужно сделать небольшую утилитку, которая могла бы взять ЛЮБОЙ dbf и перебросить в Excel. Количество записей заранее неизвестно, но запросто может оказаться больше 65536, которые Excel допускает на лист, поэтому приходится делать разбивку по листам. Прогу написал - но уж больно долго она работает... Три-десять строчек в секунду в зависимости от мощности компа и количества полей в таблице, а оно запросто может быть под 200. Код вот такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Как вы думаете, можно что-то улучшить? Может есть какие-функции, позволяющие кидать строку в эксель не перебором полей а чем-то вроде копи-паста? ;) Заранее спасибо! Юрий. _______________________________________________________ Обходя разложенные грабли, ты теряешь драгоценный опыт! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 17:10:11 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Как вариант, COPY TO или EXPORT с разбивкой по 65000 записей в разные файлы и затем сбор листов в одну книгу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 17:17:16 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Или COPY TO ARRAY порциями по 65000 элементов и вставкой в Эксель с разбивкой по листам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 17:19:31 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Ну, есть такая штука _VFP.DataToClip() Т.е. логика работы с ней примерно такая Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Ну, еще надо проверить, чтобы не было превышение 255 листов (если записей больше чем 65000*255=16,575,000). Тогда уже новый файл надо создавать. И на каждом листе надо будет удалить строку с именами полей (если они мешают) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 17:41:18 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
ВладимирМНу, есть такая штука _VFP.DataToClip() ... Ну, еще надо проверить, чтобы не было превышение 255 листов (если записей больше чем 65000*255=16,575,000). Тогда уже новый файл надо создавать. И на каждом листе надо будет удалить строку с именами полей (если они мешают) Спасибо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 18:00:01 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Владимир снимаю шляпу .... каждый день новая инфа и где Вы ее берете? Тока не говорите что в хелпе шутка, а вообще очень впечатляет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 18:15:13 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
leafкаждый день новая инфа и где Вы ее берете? Тока не говорите что в хелпе Да вопросы постоянно повторяются. Просто, так сказать, "под разным углом". Вот я и выдираю куски ответов на разные вопросы и компаную как бы новый ответ. Ну, и не забываю читать, что же отвечают другие люди на те же вопросы. Остается просто запомнить если не сам ответ, то его идею. Заданный вопрос настолько часто повторяется, что уже вроде как пора ссылки давать. Просто этот вопрос задают немного в другом виде: Как ускорить экспорт данных в Excel? И он не подразумевает простого копирования содержимого таблицы. Т.е. заданный вопрос - это упрощенный вариант более сложного, но и более часто задаваемого вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 23:49:17 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Тут давеча - обсуждали - на Foxclub как раз работу DataToClip - тормоз обоалденный чпок проще оказалось Select * from ... copy to ... as 866 в Экселе - открыть DBF таблу Было намного быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 07:50:52 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
pivaТут давеча - обсуждали - на Foxclub как раз работу DataToClip - тормоз обалденный Вообще-то, этого следовало ожидать. Ведь как физически можно загнать такую кучу записей в буфер обмена? Только просканировав таблицу. Вот на сканирование и уходит основная масса времени. Кстати, не пробовал сравнить скорость DataToClip() и прямое сканирование (SCAN+TRANSFORM()). Подозреваю, что скорость будет сопоставима. pivaпроще оказалось Select * from ... copy to ... as 866 в Экселе - открыть DBF таблу Было намного быстрее В данном случае сброс в DBF не пройдет. Надо ведь копировать данные в разные листы одного файла . А открыть DBF - означает открыть новый файл , а не новый лист. Правда, можно попробовать выполнить копирование из этого открытого файла на лист другого файла и удалить "промежуточный" файл. Надо будет как-нибудь попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 09:50:13 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
ВладимирМВедь как физически можно загнать такую кучу записей в буфер обмена? У меня вот тут появилось такое предложение: а что, если таблицу сначала сохранить на диск, а потом (в процессе переноса) работать с этим файлом как с обычным нетипизированым ( это я на днях паскалем занимался- осталось :)) в смысле - напрямую из файла читать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 10:03:12 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
w3d ВладимирМВедь как физически можно загнать такую кучу записей в буфер обмена? У меня вот тут появилось такое предложение: а что, если таблицу сначала сохранить на диск, а потом (в процессе переноса) работать с этим файлом как с обычным нетипизированым ( это я на днях паскалем занимался- осталось :)) в смысле - напрямую из файла читать? Ну-ну... А перед этим надо сначала прочитать структуру (заголовок) dbf-ки чтобы правильно парсить строку на отдельные поля и т.д... Фактически делать то, чем Фокс занимается по умолчанию... Если Вы это реализуете как внешнюю программу, например, на С/С++, то, может быть, скорость обработки слегка возрастет... Но если Вы это будете делать под Фоксом, то, вероятнее всего, скорость уменьшится... Отсюда возникает следующий вопрос:"А оно Вам нужно?!"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 10:35:17 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Станислав C. w3d ВладимирМВедь как физически можно загнать такую кучу записей в буфер обмена? У меня вот тут появилось такое предложение: а что, если таблицу сначала сохранить на диск, а потом (в процессе переноса) работать с этим файлом как с обычным нетипизированым ( это я на днях паскалем занимался- осталось :)) в смысле - напрямую из файла читать? Ну-ну... А перед этим надо сначала прочитать структуру (заголовок) dbf-ки чтобы правильно парсить строку на отдельные поля и т.д... Фактически делать то, чем Фокс занимается по умолчанию... Если Вы это реализуете как внешнюю программу, например, на С/С++, то, может быть, скорость обработки слегка возрастет... Но если Вы это будете делать под Фоксом, то, вероятнее всего, скорость уменьшится... Отсюда возникает следующий вопрос:"А оно Вам нужно?!"... Да я в принципе и не настаиваю :) Просто возникла такая идея - вот и хотелось бы узнать, в чем она изначально ошибочна :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 10:40:53 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
2piva & ВладимирМ а как Вам такая идея : выборка в курсор с формированием одного поля из строки таблицы с разделителями ес..тест..но и потом сканом в эксель на разные листы в первую колонку каждого листа квадратно-гнездовым методом .... В хелпе этого нет так что не пинайте ..... просто Ваше мнение? Так просто в голову взбрело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 12:34:12 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
leaf2piva & ВладимирМ а как Вам такая идея : выборка в курсор с формированием одного поля из строки таблицы с разделителями ес..тест..но и потом сканом в эксель на разные листы в первую колонку каждого листа квадратно-гнездовым методом .... В хелпе этого нет так что не пинайте ..... просто Ваше мнение? Так просто в голову взбрело Можно попробовать другую идею на основе "выборки в другое место" Код: plaintext 1. 2. 3. Проверил. Это работает. Правда как тут со скоростью не сравнивал. Много времени может занять "затягивание" файла в буфер обмена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 13:22:25 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
ВладимирМНу, есть такая штука _VFP.DataToClip() Ну, еще надо проверить, чтобы не было превышение 255 листов (если записей больше чем 65000*255=16,575,000). Тогда уже новый файл надо создавать. И на каждом листе надо будет удалить строку с именами полей (если они мешают) Увы, этот вариант не прошел, :( хоть и хорош. :) Просто, библиотеки не прописаны и из-за дурацкой политики безопасности на фирме их прописывать никому никуда не дают. :( Пришлось воспользоваться советом ALeksMed. Одна только проблема - когда информация из промежуточной книги Excel скопирована и она закрывается, Excel выдает предупреждение, что в ClipBoard остался огромный кусок инфы и не сохранить ли её для дальнейшей работы. Не подскажете, как это безобразие подавить и очищать ClipBoard, так как информация в нем безусловно уже не нужна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 16:05:15 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
1. loXls.DisplayAlerts=.F. - спрашивать не будет 2. Про очистку буфера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 16:20:21 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 16:29:46 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Yuri Tyurin ВладимирМНу, есть такая штука _VFP.DataToClip() Увы, этот вариант не прошел, :( хоть и хорош. :) Просто, библиотеки не прописаны и из-за дурацкой политики безопасности на фирме их прописывать никому никуда не дают. О каких библиотеках идет речь? Вроде бы здесь нет сторонних библиотек. _VFP.DataToClip() - это родной метод FoxPro. Кажется, введен в VFP5. Если запустили FoxPro, то автоматом запустили и эти библиотеки. Поробуйте через текстовый файл и FileToStr() с прямой записью в буфер через _ClipText. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 16:29:50 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ ИМХО DataToClip() имеет еще одно маленькое/большое неудобство: скопированные данные имеют шанс схлеснуться в клипбоарде с данными скопированными из других приложений, маловероятно, НО могут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 16:37:27 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Yuri Tyurin ВладимирМНу, есть такая штука _VFP.DataToClip() Увы, этот вариант не прошел, :( хоть и хорош. :) Просто, библиотеки не прописаны и из-за дурацкой политики безопасности на фирме их прописывать никому никуда не дают. О каких библиотеках идет речь? Вроде бы здесь нет сторонних библиотек. _VFP.DataToClip() - это родной метод FoxPro. Кажется, введен в VFP5. Если запустили FoxPro, то автоматом запустили и эти библиотеки. Поробуйте через текстовый файл и FileToStr() с прямой записью в буфер через _ClipText. Владимир, тут ситуация такая - даже FoxPro у нас устанавливается... прямым копированием каталога Visual FoxPro 6.0 с CD. То есть он запускается, но в регистре винды его как бы и нет. Видимо поэтому он вчера сразу же ругнулся на отсутствие библиотеки: OLE Error Code 0x8002801d: библиотека не зарегистрирована. Руководители компании (а они сидят не в РФ) все время боятся, что у них информацию сопрут, поэтому заблокировано всё, что только можно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Что-то где-то не настраиваю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 16:57:38 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Файл CONFIG.FPW (это обычный текстовый файл) со строкой CODEPAGE = 1251 лежит рядом с EXE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 17:01:18 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
ВладимирМФайл CONFIG.FPW (это обычный текстовый файл) со строкой CODEPAGE = 1251 лежит рядом с EXE? Уже лежит. :) А всё равно тоже самое получается. :( Как вариант - может влиять то, что база, на которой я обкатываю прогу, была в свое время конвертирована из Excel в формат Dbase IV и при открытии в VFP6 ей была присовена страница 866? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 17:09:11 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
AleksMed1. loXls.DisplayAlerts=.F. - спрашивать не будет 2. Про очистку буфера Вот, обошёл буфер, прямое копирование с листа на лист: Код: plaintext 1. 2. 3. Заработало! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 17:15:14 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
Yuri TyurinКак вариант - может влиять то, что база, на которой я обкатываю прогу, была в свое время конвертирована из Excel в формат Dbase IV и при открытии в VFP6 ей была присовена страница 866? Нет, не может. Разумеется, если у нее явно прописана кодовая страница и текстовый файл получается читаемый сам по себе. Здесь может быть глюк операционки. Теоретически, надо сделать исправление в реестре НА КЛИЕНТСКОЙ машине. Там где работа с буфером происходит. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage] "1252"="c_1251.nls" Если админ не позволит, то проверить, виноват ли именно реестр или что-то еще можно проверить следующим образом. Если результат зависит от текущей раскладки клавиатуры (при английской - все в порядке, при русской - закорючки), значит виноват именно этот ключ реестра. Впрочем, если обошел буфер, тем лучше, поскольку действительно может вклиниться пользователь пока идет работа с буфером и все испортить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 17:24:09 |
|
||
|
Как быстро перекинуть неизвестный dbf в Excel? (+)
|
|||
|---|---|---|---|
|
#18+
ВладимирМЗдесь может быть глюк операционки. Теоретически, надо сделать исправление в реестре НА КЛИЕНТСКОЙ машине. Там где работа с буфером происходит. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage] "1252"="c_1251.nls" Если админ не позволит, то проверить, виноват ли именно реестр или что-то еще можно проверить следующим образом. Если результат зависит от текущей раскладки клавиатуры (при английской - все в порядке, при русской - закорючки), значит виноват именно этот ключ реестра. Впрочем, если обошел буфер, тем лучше, поскольку действительно может вклиниться пользователь пока идет работа с буфером и все испортить... Марррразм! ) Но именно так все и оказалось! ) Только наоборот - при включенной русской раскладке текст нормальный, при английской - кракозябры. Спасибо! Но всё таки, наверно, оставлю мой вариант с копированием без буфера. Пользователи уже попробовали - их всё устраивает, да и действительно надёжней. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 18:06:02 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=310&tid=1593794]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 312ms |

| 0 / 0 |
