:: Visual Foxpro, Foxpro for DOS
Сохранить книгу Excel из 2-х и больше листов в DBF
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Пробую сохранить xls-файл в котором больше одного листа:
lcFileXls = GETFILE('xls')
tcResultDbf = "outxls"
loExcel = CREATEOBJECT("Excel.Application")
loWorkBook = loExcel.WorkBooks.OPEN(lcFileXls)
lcTempFileName = SYS(2023) + '\' + tcResultDbf + ".xls"
ERASE(lcTempFileName)
loWorkBook.SAVEAS(m.lcTempFileName, 39, "", "", .f., .f.)
loWorkBook.CLOSE()
loExcel.Quit()
IMPORT FROM (m.lcTempFileName) TYPE XL5
ERASE (m.lcTempFileName)
но в результате получаю толко один лист
понимаю. что скорее всего IMPORT FROM (m.lcTempFileName) TYPE XL5 сохраняет только один лист. Вопрос могу ли я перебирая листы книги в цикле, сохранять каждый в временный xls-файл? а потом уже его IMPORT FROM (m.lcTempFileName) TYPE XL5 в DBF?
lcFileXls = GETFILE('xls')
tcResultDbf = "outxls"
loExcel = CREATEOBJECT("Excel.Application")
loWorkBook = loExcel.WorkBooks.OPEN(lcFileXls)
lcSheetsCount = loWorkBook.Sheets.Count
FOR lSheet=1 TO lcSheetsCount
WITH loWorkBook.Sheets(lSheet)
lcTempFileName = SYS(2023) + '\' + tcResultDbf + ALLTRIM(STR(lSheet)) + ".xls"
ERASE(lcTempFileName)
.SAVEAS(m.lcTempFileName, 39, "", "", .f., .f.)
IMPORT FROM (m.lcTempFileName) TYPE XL5
ERASE (m.lcTempFileName)
ENDWITH
ENDFOR
loWorkBook.CLOSE()
loExcel.Quit()
но для листа .SAVEAS(m.lcTempFileName, 39, "", "", .f., .f.) не работает.
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А как она "не работает"?
IMPORT будет читать из ТЕКУЩЕГО листа (который виден при открытии файла экселом),
также есть есть опция IMPORT...SHEET имя листа, также,
перед сохранением листа .SAVEAS(m.lcTempFileName, 39, "", "", .f., .f.) можно активировать нужный лист.
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
SaveAs применимо только к книге, но при этом в некоторых форматах (csv, dbf и др.) сохраняется только текущий лист. То есть лист перед сохранением в этих форматах делаем активным, затем сохраняем книгу. Но в случае с сохранением в формат excel это не поможет, там все листы будут (разве что удалять их перед записью, но смысл?).
Тема импорта/экспорта excel<->dbf много раз здесь обсуждалась, вот одно из попавшихся обсуждений: forum.foxclub.ru



Исправлено 1 раз(а). Последнее : ry, 12.12.17 12:13
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Импорт листа ошибку почемуто дает:
lcSheetsCount = loWorkBook.Sheets.Count
FOR lSheet=1 TO lcSheetsCount
WITH loWorkBook.Sheets(lSheet)
m.lcSheet = .Name
IMPORT FROM (m.lcTempFileName) TYPE XL5 SHEET m.lcSheet
IF lSheet = 1
SELECT * FROM (m.lcTempFileName) INTO CURSOR Cur01 READWRITE
ELSE
INSERT INTO Cur01 SELECT * FROM (m.lcTempFileName)
ENDIF
ENDWITH
ENDFOR
Ошибка:
OLE Error code ...: A share violation has occurred.
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
IMPORT не читает из ТЕКУЩЕГО листа (который виден при открытии файла экселом), он всегда читает тз 1-го листа. Остаётся надежда только на IMPORT...SHEET имя листа.
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
вот так попробуй:
SHEET (m.lcSheet)
SHEET &lcSheet
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
hztp_serg
Импорт листа ошибку почемуто дает:
...
OLE Error code ...: A share violation has occurred.
По моему это очевидно - не может фокс импортировать что либо из ОТКРЫТОГО в данный момент в экселе документа (и совершенно неважно что это фокс же и инициировал сие открытие).
У IMPORT применимо к экселевским документам хватает своих ограничений. Только очень простые, или специально "подчищенные" листы он сможет адекватно импортировать - ну и да, работать будет исключительно с антикварными форматами - XL5 это формат Excel 5.0 (год выпуска 1993), XL8 - формат Excel 97. Нынче уже 2018 год на носу, и текущая версия экселя это Excel 2016 (внутренний номер 16.0).
При большом желании, конечно, можно копировать листы по одному в новую книгу (где будет только 1 лист) и уж её сохранять - при том вполне себе не в один из xls форматов, а в простой dbf - фокс его поймёт (разве что байт кодовой страницы потребуется прописать через cpzero.prg). Но если уж работа идёт через автоматизацию экселя, то нет проблем и в том чтобы просто напрямую забрать все данные из листа в массив.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
И таки да, самое простое - пробежаться посредством автоматизации самого экселя по листам и собрать (лучше через массив - быстрее, но данные нужны упорядоченные, иначе разгребать) все в курсор.
Таку задачу частенько приходилось "решать" уже неоднократно - скорость удобоваримая - екселька на 20-30 листов по 3-5 тыс строк на каждом собирается за 20-40 сек

upd: Кстати, ИК за показанный (в свое время) на эту тему пример огромное спасибо )))



Исправлено 1 раз(а). Последнее : AndyNigmatec, 12.12.17 20:14
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
ABB

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
Посмотрите praisachion.blogspot.ru
Ratings: 0 negative/0 positive
Re: Сохранить книгу Excel из 2-х и больше листов в DBF
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ежели бы автор адекватный метод разбора XML файлов применял, а не самодельный велосипед - цены бы ему не было
P.S. Ну и да, к сожалению в XML-ях только "новые" офисные форматы сделаны - старьё xls/doc не на XML основано, и таким простым (сравнительно простым, т.к. там есть масса своих заморочек - потому и кода прилично) способом не разбираются, увы.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 13.12.17 14:54
Ratings: 0 negative/0 positive


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

On-line: 24 (Гостей: 24)

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