:: Visual Foxpro, Foxpro for DOS
XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Всем привет ! Небольшое вступление )

Рутина такая - ежедневная (а то и чаще) загрузка всевозрастающего множества прайс-листов из Excel от поставщиков пока себя не изжила )
Далеко не у всех у них есть Web сервисы, есть конечно и API агрегаторы,
но удобно (и дешевле) иметь их под рукой еще и в родных DBF таблицах.
Особенно при массовых проценках/переоценках и расширении ассортимента.

Выложил в облако один из них.

cloud.mail.ru

Нужно загрузить его скажем в такую таблицу (порядок полей Не соответствует колонкам в Excel):

Use In Select("Price")
Create Table Price (cName c(80), cBrand c(40), cNumber c(20), cModel c(80), nQuantity i, nPrice n(10,2))

Как бы вы это сделали ? ))


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
PaulWist

Сообщений: 14741
Дата регистрации: 01.04.2004
Равиль

Как бы вы это сделали ? ))

Решение не смотрел.

Сделал бы, а-ля sqlexec(select * from Лист1)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
shumik73

Сообщений: 554
Откуда: Алматы
Дата регистрации: 10.05.2006
Равиль да это просто!

Создаешь для загрузки таблицу в базе.
Прописываешь поля которые будут заполнены - константами
Прописываешь поля которые будут заполнены - во время загрузки
Вызываешь вот такую форму и передаешь в нее нужные параметры

[attachment 37029 Excel.png]

Дальше идет работа:
1) Открываешь Exсel - файл с диска и вынимаешь данные из него или копируешь через буфер
3) Визульно редактируешь данные под заданный шаблон (удадяем мусор, сдвигаем)
3) Запускаешь функцию анализа данных - ищем начальный и конечный столбец, ищем начальную и конечную строку
4) Выделенный фрагмент выделяется
5) Загружаешь и по ходу отлавливаешь конфликты
6) Неудачно - очищаешь в базе все что успел загрузить и заново загружаешь.

Если бы все Excel-файлы были одного формата - то работа бы упростилась
Иначе приходится подгонять и следить чтобы никто не вздумал менять шаблон
Делегируешь другому эту сложную задачу, а сам идешь курить. И всЁ



Исправлено 1 раз(а). Последнее : shumik73, 10.01.25 14:49
Ratings: 0 negative/1 positive
Re: XLS(x) -> DBF
AndyNigmatec

Сообщений: 1675
Откуда: Волгоград
Дата регистрации: 28.06.2015
Как я делаю (задача подобная):
сразу оговорю - использую автоматизацию самого эксель - не всех такой вариант устраивает.

1. создаю курсор со структурой соответствующей импортируемым данным из эксельки
2. открываю эксельку и одним чохом забираю все данные с нужного листа в подготовленный курсор
3. из курсора забираю и добавляю нужное уже в свои табл

понятно что вызываемые экземпляры экселя юзверю не показываю (ни к чему эти мелькания и тормоза)

Сам импорт работает весьма шустро, основной тормоз - это хоть и скрытое, но все равно открытие экселем файла.
Также к минусам такого подхода можно отнести то что необходимо знать структуру импортируемых данных (в том числе и порядок столбцов имеет значение), из-за чего приходится использовать несколько вариантов импорта (различие в п.1 - создание курсора нужной структуры).
Ratings: 0 negative/1 positive
Re: XLS(x) -> DBF
BOBAN

Сообщений: 646
Откуда: Солигорск
Дата регистрации: 05.07.2004
praisachion.blogspot.com
Ratings: 0 negative/1 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
PaulWist
Равиль

Как бы вы это сделали ? ))

Решение не смотрел.

Сделал бы, а-ля sqlexec(select * from Лист1)

Паш, пробовал и так на коленке - вполне но притормаживает заметно.


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
shumik73
Равиль да это просто!
Создаешь для загрузки таблицу в базе.
Прописываешь поля которые будут заполнены - константами
Прописываешь поля которые будут заполнены - во время загрузки
Вызываешь вот такую форму и передаешь в нее нужные параметры

[attachment 37029 Excel.png]

Дальше идет работа:
1) Открываешь Exсel - файл с диска и вынимаешь данные из него или копируешь через буфер
3) Визульно редактируешь данные под заданный шаблон (удадяем мусор, сдвигаем)
3) Запускаешь функцию анализа данных - ищем начальный и конечный столбец, ищем начальную и конечную строку
4) Выделенный фрагмент выделяется
5) Загружаешь и по ходу отлавливаешь конфликты
6) Неудачно - очищаешь в базе все что успел загрузить и заново загружаешь.

Если бы все Excel-файлы были одного формата - то работа бы упростилась
Иначе приходится подгонять и следить чтобы никто не вздумал менять шаблон
Делегируешь другому эту сложную задачу, а сам идешь курить. И всЁ

Женя, симпатично у тебя сделано !
Вижу только 1 минус - под шаблон подгонять приходится
а прайсы все такие разные ...


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
AndyNigmatec
Как я делаю (задача подобная):
сразу оговорю - использую автоматизацию самого эксель - не всех такой вариант устраивает.

1. создаю курсор со структурой соответствующей импортируемым данным из эксельки
2. открываю эксельку и одним чохом забираю все данные с нужного листа в подготовленный курсор
3. из курсора забираю и добавляю нужное уже в свои табл

понятно что вызываемые экземпляры экселя юзверю не показываю (ни к чему эти мелькания и тормоза)

Сам импорт работает весьма шустро, основной тормоз - это хоть и скрытое, но все равно открытие экселем файла.
Также к минусам такого подхода можно отнести то что необходимо знать структуру импортируемых данных (в том числе и порядок столбцов имеет значение), из-за чего приходится использовать несколько вариантов импорта (различие в п.1 - создание курсора нужной структуры).

Андрей, спасибо - я тоже нечто похожее делаю - через промежуточный курсор


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003

Владимир, спасибо - гляну.
Еще Сергей не отозвался (ssa) - знаю что он в Excel как рыба в воде ))


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
shumik73

Сообщений: 554
Откуда: Алматы
Дата регистрации: 10.05.2006
Равиль
Вижу только 1 минус - под шаблон подгонять приходится
а прайсы все такие разные ...

А это другая задача - консолидация!

1) Создаешь справочник поставщиков прайсов
2) Для каждого готовишь шаблон и таблицу (в моем загрузчике на второй вкладке "схема" есть настройки где прописывается для 30 столбцов - что с ними делать: пропускать или конвертировать)
3) При загрузке первым делом выбираешь поставщика, происходит настройка "схемы" и загружаешь по шаблону.
4) Осталось за малым собрать все в одном формате.

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

Это что, для аптечной компании мы потом приводили все наименования к одному формату.
Закладывали "словарь" и варианты исполнения. И когда шла загрузка то происходило разпознование и в базу ложились правильное название.
Правда приходилось постоянно обучать "словарь" - когда новый поставщик или новое наименование появлялось.
Но этим занимались каждую неделю соответствующие закрепленные операторы.



Исправлено 1 раз(а). Последнее : shumik73, 10.01.25 16:48
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Интерфейс загрузки из Excel у меня такой для прайсов - не судите строго - заложен еще в начале века

Сначала импорт из Excel в промежуточный курсор,
Затем на экране можно сопоставить/уточнить колонки.
Затем во время загрузки настройки колонок запоминаются для каждого поставщика свои.
Настройки редко меняются.

Как был сделан импорт :
- объект Excel открывает и пересохраняет файл в текстовик с табуляторами - быстро.
- аппенд в курсор из текстовика - тоже быстро.
- в рабочую таблицу заполняю из курсора с учетом настроек колонок.

Минус - нужен Excel (или аналог)



------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
shumik73
Равиль
Вижу только 1 минус - под шаблон подгонять приходится
а прайсы все такие разные ...

А это другая задача - консолидация!
1) Создаешь справочник поставщиков прайсов
2) Для каждого готовишь шаблон и таблицу
3) При загрузке первым делом выбираешь поставщика и загружаешь
4) Осталось за малым собрать все в одном формате.

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

.....

Да, так и сделано - одинаково думаем !


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
AndyNigmatec

Сообщений: 1675
Откуда: Волгоград
Дата регистрации: 28.06.2015
Равиль
Как был сделан импорт :
- объект Excel открывает и пересохраняет файл в текстовик с табуляторами - быстро.
- аппенд в курсор из текстовика - тоже быстро.
...

а зачем промежуточное сохранение в текстовик, только лишний тормоз, нормально все сразу с листа в курсор забирается.

Типа такого:

создали курсор нужной структуры:
CREATE CURSOR cData (....)
затем забрали сразу все:
laData=loExcel.Workbooks(....).Sheets(1).UsedRange.Value
select cData
APPEND FROM ARRAY laData as 866
Ratings: 0 negative/1 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
AndyNigmatec
Равиль
Как был сделан импорт :
- объект Excel открывает и пересохраняет файл в текстовик с табуляторами - быстро.
- аппенд в курсор из текстовика - тоже быстро.
...

а зачем промежуточное сохранение в текстовик, только лишний тормоз, нормально все сразу с листа в курсор забирается.

Типа такого:

создали курсор нужной структуры:
CREATE CURSOR cData (....)
затем забрали сразу все:
laData=loExcel.Workbooks(....).Sheets(1).UsedRange.Value
select cData
APPEND FROM ARRAY laData as 866

Кстати да ... надо попробовать - там не будет ошибки несоответствия типов полей при Append ?
Потому что я не знаю заранее какие будут типы полей в промежуточном курсоре - они у меня все текстовые ...


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
AndyNigmatec

Сообщений: 1675
Откуда: Волгоград
Дата регистрации: 28.06.2015
Равиль
Кстати да ... надо попробовать - там не будет ошибки несоответствия типов полей при Append ?
Потому что я не знаю заранее какие будут типы полей в промежуточном курсоре - они у меня все текстовые ...

какие типы в курсоре создадим - такие и будет аппендить ... собсно так же как и из текстовика.

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

Но тут конечно зависит от вида/чистоты данных, иногда лучше принимать в текстовом и уже у себя разбирать.



Исправлено 2 раз(а). Последнее : AndyNigmatec, 10.01.25 17:36
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
AndyNigmatec
Равиль
Кстати да ... надо попробовать - там не будет ошибки несоответствия типов полей при Append ?
Потому что я не знаю заранее какие будут типы полей в промежуточном курсоре - они у меня все текстовые ...

какие типы в курсоре создадим - такие и будет аппендить ... собсно так же как и из текстовика.
...

Да, мне понравилось ! Спасибо !

laData=loExcel.Workbooks(....).Sheets(1).UsedRange.Value
APPEND FROM ARRAY laData as 866

шустро работает ! 370 тыс записей за 10 сек загружаются !

Надо все переписать ...
Из-за этого и тему создал - более быстрые способы найти ))


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
sphinx

Сообщений: 31893
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Цитата:
использую автоматизацию самого эксель - не всех такой вариант устраивает.

Андрей, я и не буду спорить. Евгения знаю с Девконов, он и Скпилев я охреневал, каки что ваяли парни.

У него были процедуры, которые, к примеру, определяют, каким почтовым сервером везти. Код на сайте, найти можно, да и Женьк поделится еще раз, уверен.

И есть подозрение, перетекающее в уверенность, что с отчетами у него автомат полный, и опять от системы выода нихрена не зависит.

Я использовал почти 15 лет назад одну систему, ей похрен на автоматизацию через COM. Разумеется в ознакомительных целях.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
of63
Автор

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Если бы все Excel-файлы были одного формата - то работа бы упростилась

Я напрягся, и интерпретировал колонки в листе файл эксел (зная, что в них, и более и равной чем в одной) информации, что это дата, ИНН, СНИЛС, сумма, процент... Трудоемкая задача...

Это "ИИ" )

Доб. Код не буду показывать - много строк и подпрограмм, но понимает колонки (и отличает заголовки, находит конец данных, прощает прогалы в колонках). Крайне удобгная штука. Главное - знать что искать. ЗВ моем случае помогло, что я ищу заведомо известнные типы данных, например ИНН, МНИЛС - они структурированы...



Исправлено 1 раз(а). Последнее : of63, 13.01.25 23:07
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
glaz58

Сообщений: 821
Откуда: Воронеж
Дата регистрации: 09.02.2008
Можно через Libre Office. XLSX открыть с помощью Libre Office Calc, а потом сохранить как dbf.
Ratings: 0 negative/0 positive
Re: XLS(x) -> DBF
of63
Автор

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Какие будут имена колонок и типы данных (и как быть с многострочными 'memo-данными) ?

Адекватнее всего, когда какая-то "машина" выгрузила ДБФ колонками под именами "A","B"... с ними внимательно надо обращаться ввиду имен таких, но юзабельно в фоксе, он позволяет при соблюдении его фишек!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 alextash  (Гостей: 18)

© 2000-2025 Fox Club 
Яндекс.Метрика