:: Visual Foxpro, Foxpro for DOS
как же все-таки передать разом таблицу dbf в excel_2007
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Добрый день! На моем попечении база из 142000 записей. Каждый квартал мне надо перебросить базу в эксель и отправить в министерство. В данный момент я делаю примитивно - делю базу на три куска: mater_1.xls(60000 строк), mater_2(60000 стр.) и mater_3(22000 строк) , а потом собираю их в одно целое на просторах листа Эксель-2007 (10 млн. строк). Эта проблема обсуждалась на форуме, может быть кто-то уже нашел простое решение? Мне пока не удается. Поделитесь!


------------------
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Приблизительно так

USE MATERIAL AGAIN EXCLUSIVE
COPY TO material_1 FOR RECNO()<=60000 TYPE xl5
COPY TO material_2 FOR RECNO()>60000 AND RECNO()<=120000 TYPE xl5
COPY TO material_3 FOR RECNO()>120000 TYPE xl5
CLOSE TABLES
WAIT 'Сохранены под именами material_1, material_2, material_3 ..!'
QUIT
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну про exclusive - ваще моветон канеш, но не про это речь ...

Ежели на машине где вы все это делаете установлен офис-2007 или старше - то нет проблем передать сразу все массивом - примеров тут на формуме вагон и тележка в придачу )))
Если поиском не найдете - пишите - разыщем
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
ну вот вам основная идея:

#DEFINE xlOpenXMLWorkbook 51
#DEFINE xlNormal -4143
lcNameFile='C:\temp\test.xls'
SELECT 0
CREATE CURSOR c1 (cname c(20), lnum i, ldate d)
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Вася', 4, {^1978-12-24})
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Петя', 3, {^1987-05-12})
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Маша', 100500, {^1984-01-08})
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Гриша', 135, {^1973-08-30})
SELECT * FROM c1 INTO ARRAY laData
lcRowsData=ALEN(laData,1)
lcColumnsData=ALEN(laData,2)
loExcel = CREATEOBJECT("Excel.Application")
IF TYPE('loExcel')='O'
WITH loExcel
lxlsversion=VAL(.Version)
.Visible=.F.
.EnableEvents=.T.
.DisplayAlerts=.F.
IF lxlsversion>=12
lcFileOut=ADDBS(JUSTPATH(lcNameFile))+JUSTSTEM(lcNameFile)+'.xlsx'
ELSE
lcFileOut=ADDBS(JUSTPATH(lcNameFile))+JUSTSTEM(lcNameFile)+'.xls'
ENDIF
.WorkBooks.Add()
lcWbName=.ActiveWorkbook.Name
IF lxlsversion>=12
.Workbooks(lcWbName).SaveAs(lcFileOut,xlOpenXMLWorkbook)
lcWbName=JUSTFNAME(lcFileOut)
ELSE
.Workbooks(lcWbName).SaveAs(lcFileOut,xlNormal)
lcWbName=JUSTFNAME(lcFileOut)
ENDIF
loSheet = .Workbooks(lcWbName).Sheets(1)
loSheet.Cells(2,1).Resize(lcRowsData, lcColumnsData).Value = PassArray('laData')
.Workbooks(lcWbName).Save()
.Workbooks(lcWbName).Close(.F.)
.Quit()
ENDWITH
ENDIF
FUNCTION PassArray
LPARAMETERS tcArrayName
* Трюк для передачи массива данных обратно в диапазон ячеек Excel.
RETURN @&tcArrayName

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

loExcel.Workbooks.Add(lcFileMask)

где lcFileMask - ваш шаблон



Исправлено 1 раз(а). Последнее : AndyNigmatec, 22.04.17 11:08
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Однако ты не прав! Вина в самом Фоксе! В нем заложен механизм - передавать на лист любого екселя, старого или нового, только 4 Kb (65536) строк.
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
Зачем спорить))) - проверь

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

я таким образом порядка 100 тыс. выгружал (да, извращение, но так нужно было начальству, хз че они на таком обьеме в экселе увидят)



Исправлено 1 раз(а). Последнее : AndyNigmatec, 22.04.17 11:16
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Этот код я рассматривал час назад, автор его жалуется на медленную его работу. Как я понял из кода, здесь перебрасывается не строчка целиком, а поклеточно через массив, а это уже не то. Я хочу чтобы эти две строки:

use material
copy to otchet type xls

передавали екселю не 64 кв, а миллион строк.
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
Какое поклеточно !вы читать умеете - массив целиком за раз - и работает очень быстро - проверено
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Если прямо в эксель, то > 64К строк в один присест не получится. В CSV выгрузи, и открой его экселем, и сохрани в экселе. Напрямую затолкать миллионы строк в эксель - чревато, то работает, то нет...
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Версия позволяет - у 2007-го 1 млн. А пока пойду другим путем.
Когда все три моих куска базы : материал1, материал2 и материал3 будут готовы, я программным путем перемещу их на чистый лист 2007-го, сначала первого, потом впритык снизу второго, и т.д.
вот как:
Count all to strok
stolb = Fcount()

эти две строчки дадут мне размеры каждого куска,
и тогда я выделю и скопирую эти куски и склею,
наконец, все куски в одно целое!
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
"В CSV выгрузи" ЧТО ЭТО СSV?

Спасибо вам, проверю варианты..
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Недавно мучались в эксель-2007 с 300 тыс строк, колонок на 30. Эксель практически не работает, если что-то реально делать: копировать колонки, колонку с формулой делать, фильтровать, Куски, правда, обьединять получается. Эксель встает тупо, ждешь минут 10-30, и плюнешь. Удается вобщем только наполнить. Хотя в тестовых примерах все так как-то работает. На реальном же шаблоне, с реальными данными, все печально как-то с экселем. Может форматирования ему мешают, может данные какие, количество символов... хз, что этому танцору мешает )
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
А excel-2007 dbf-файлы уже не признает? Вроде бы есть какие-то дополнения для чтения dbf. Но не уверен.

А сохранить можно из фокса и с разделителями Tab, например.

Use mytable
Copy to mytable SDF deli with TAB

А любой excel такие текстовые файлы без проблем хавает.
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Пока DBF читает, если делать DBF в TYPE FOX2X AS 866. Создавать DBF уже не будет.
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Как из 142тыщ получается 10млн?
А министерство в другом формате не желает?
Они что реально будут этот файл в ехселе смотреть?

Выгрузил строчку в один файл, две во второй. Сравнил, проанализировал.
И создал файл с нуля чисто файловыми функциями.
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Дело програмера - "здать" в звказанном формате, хошь в экселе на миллионы записей, хошь XML на 100 МБайт. Ничего уже давно не удивляет. Просто надо все это знать и уметь. На нативном фоксе все это можно, что радует
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
of63
Если прямо в эксель, то > 64К строк в один присест не получится. В CSV выгрузи, и открой его экселем, и сохрани в экселе. Напрямую затолкать миллионы строк в эксель - чревато, то работает, то нет...
- работает Олег, поверь ))) - это ТС сомневается пчему-то... тока вот что потом с такой монструозной экселькой делать - это да, бааальшой вопрос
Ну да наши органы любат херней заниматься - как пример - файл реестра предельных зарегестрированных цен на препараты ЖНВЛС - он именно в экселе с сайта скачивается - и работать с ним напрямую - геморно весьма
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Да верю я ) Я как-то экспериментировал forum.foxclub.ru и у меня работает, но ставлю эту механику в свою подпрограмму - и бац, ОЛЕ-ошибка какая-то на количествах >64К. Убил на нее полдня, надоело, и пошел другим путем.

Да, 2Симпле, вспомнил, чем не подошло читать экселем DBF - мемо-поля эксель не видит, а мне надо было длинные названия какие-то, пришлось через CSV. В CSV можно символы перевода строки закодировать, а потом в экселе уже - раскодировать Replace, и получатся ячейки с исходным многострочным текстом... Вроде так...
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
of63
Дело програмера - "здать" в звказанном формате, хошь в экселе на миллионы записей, хошь XML на 100 МБайт. Ничего уже давно не удивляет. Просто надо все это знать и уметь. На нативном фоксе все это можно, что радует

Вот только не надо мне муйню говорить про дело. Я давно живу, в курсе. От той технической стороны до этой масса планктона.
Вполне вероятно что здесь девочка в списке возможных форматов увидела единственное знакомое слово и поехало. Или министерство и денег на ексель выдает.
Ну и про нативность. Ага. Оле автоматизация как раз 'чистый фокс'.
Ratings: 0 negative/0 positive
Re: как же все-таки передать разом таблицу dbf в excel_2007
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
Кстати, при передачи целиком массивом - мемо тож сразу выводится )))
Ratings: 0 negative/0 positive


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

On-line: 16 Равиль kornienko_ru  (Гостей: 14)

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