Форум » [x]Harbour » Вопрос по Excel ? » Ответить

Вопрос по Excel ?

Andrey: Всем привет. Вопрос к знатокам Excel-я, как подсчитать сумму ВСЕХ значений с минусом и с плюсом ? Вот есть таблица из многих столбцов. Как сделать формулу для расчёта этих значений по 2-му столбцу ?

Ответов - 153, стр: 1 2 3 4 5 6 7 8 All

Pasha: oRange:Characters(1, 6):Font:Bold := .t.

Dima: Pasha Работает, спасибо ! Попробовал на удачу еще так oSheet:Cells( 1, 2 ):Characters(1, 6):Font:Bold := .t. тоже пашет

Andrey: Вот опять нашёл бяку для Экселя в МиниГуи - если имена папки на русском, то записать книгу в файл не может ! Ошибка: Error 8919500/-2147352573 DISP_E_MEMBERNOTFOUND: SAVEAS Called from TOLEAUTO:SAVEAS(0) Called from MYCREATEONEXLS(97) in module: util_xls.prg Строка 97: oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) Блин, а нельзя ли как то ОЛЕ это исправить ? А то получаются программы на МиниГуи (терминалку не пробовал) урезанного профиля, папки на русском не создавать .. и т.д. Во всех других языках - каталоги и файлы давно на русском языке используют.


Pasha: Если дело в кодировке, тогда вопрос: в поставке минигуи уникодный харбор или нет ? Содержание ошибки: объект oWorkBook не содержит метода SaveAs Какого класса объект oWorkBook - фиг его знает. При правильном присваивании должен быть класса WorkBook, а правильным ли оно было ? На прошлой странице попадался код: oBook := oExcel:ActiveSheet() объект oBook оказывается класса WorkSheet, что приводит к непоняткам при анализе кода. А что насчет oWorkBook ?

Andrey: Pasha пишет: А что насчет oWorkBook ? Вот про это я и спрашивал, код был из разных источников, под 2003-2007 везде работает, а на 2014-2016 уже вылетает. Как правильно написать код (чтобы и другие ориентировались на это) ? [pre2]#include "excel.ch" .... oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. // НЕ Показывать EXCEL oExcel:DisplayAlerts := .F. // не приставать с запросами oExcel:Workbooks:Open( cFileName, 0 ) oBook := oExcel:ActiveSheet() IF FILE( cFileSave ) // Чтобы Excel не приставал в вопросом "Такой файл уже существует" или захвачен другим Excel nErr := DELETEFILE(cFileSave) IF nErr == 0 oBook:SaveAs( cFileSave, xlCSV ) // xlCSV - см. #include "excel.ch" lRet := .T. ELSE cMsg := "Ошибка удаления файла: "+cFileSave+" !; Ошибка: "+HB_NtoS(nErr)+";;" cMsg += "Файл занят другим процессом в памяти !;;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Ошибка!" ) lRet := .F. ENDIF ELSE oBook:SaveAs( cFileSave, xlCSV ) // xlCSV - см. #include "excel.ch" lRet := .T. ENDIF oExcel:Quit() Return lRet[/pre2]

Pasha: Ээ, Андрей, ты перепутал лист и книгу, и до сих пор не заметил, что ли ? oBook := oExcel:ActiveSheet() это лист. Только имя переменной надо давать что-то вроде oSheet oBook := oExcel:ActiveWorkBook() а это книга

Andrey: Pasha пишет: Ээ, Андрей, ты перепутал лист и книгу, и до сих пор не заметил, что ли ? Не заметил...

Andrey: Но все равно дело не в этом... А в русских буквах .... Протестировал следующее: WinXP - {12.0, "Excel 2007"} - папка: XLS_to_CSV Win7 - {16.0, "Excel 2014"} - папка: XLS_to_CSV Функция записи работает без ошибок !!! WinXP - {12.0, "Excel 2007"} - папка: XLS_to_CSV_русские_буквы Win7 - {16.0, "Excel 2014"} - папка: XLS_to_CSV_русские_буквы Вылетает с ошибкой: Error 2201828/-2147352573 DISP_E_MEMBERNOTFOUND: SAVEAS Called from TOLEAUTO:SAVEAS(0) Called from MYCREATENEWXLS(105) in module: util_xls.prg Вот сама функция: [pre2]////////////////////////////////////////////////////////////////////// FUNCTION MyCreateNewXls(cFileName) LOCAL nI, oExcel, nVerExcel, oWorkBook, oSheet, cMsg, nErr LOCAL nLine, nCount, aDim, cFont, nFSize, cType, xValue, nDecVal IF ! IsExcelFound() // check for Excel on your computer RETURN .F. ENDIF IF FILE( cFileName ) nErr := DELETEFILE(cFileName) IF nErr # 0 cMsg := REPLICATE( "-._.", 16 ) + ";;" cMsg += "Ошибка удаления файла: "+cFileName+" !; Ошибка №: "+HB_NtoS(nErr)+";;" cMsg += "Файл занят другим процессом в памяти !;;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Error!" ) RETURN .F. ENDIF ENDIF oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .F. oExcel:DisplayAlerts := .F. nVerExcel := VAL( oExcel:Version ) oWorkBook := oExcel:WorkBooks:Add() oSheet := oExcel:ActiveSheet() cFont := "Arial" ; nFSize := 12 oSheet:Cells:Font:Name := cFont oSheet:Cells:Font:Size := nFSize nLine := 3 nCount := 7 // ------- table header --------------- oSheet:Cells( 1, 1 ):Value := "Test table for converting Xls to Csv" oSheet:Cells( 1, 1 ):Font:Size := nFSize // Combine the cells of the selected range from 1 to nCount into one cell oSheet:Range(oSheet:cells(1,1),oSheet:cells(1,nCount)):MergeCells:=.t. oSheet:Cells( 1, 1 ):HorizontalAlignment := xlCenter DO WHILE .T. aDim := { DATE(), "901010"+HB_NtoS(10+nLine), "001", "Street", "11A" , HB_NtoS(nLine), 100-(nLine*1.5) } FOR nI := 1 TO LEN(aDim) cType := VALTYPE(aDim[nI]) xValue := aDim[nI] IF cType == "D" oSheet:Cells( nLine, nI ):SET( "NumberFormat", "@" ) ELSEIF cType == "N" nDecVal := xValue - INT(xValue) IF nDecVal == 0 // значит целое число oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0' ) ELSE oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0,00' ) ENDIF ELSE oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) ENDIF oSheet:Cells( nLine, nI ):Value := xValue oSheet:Cells( nLine, nI ):Borders():LineStyle := 1 NEXT nLine ++ IF nLine > 103 EXIT ENDIF DO EVENTS // ALWAYS! To make the form NOT freeze ENDDO oSheet:Cells( nLine+1, 1 ):Value := "End table" oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) // строка 105 oExcel:Quit() RETURN .T.[/pre2] Может в коде что-то нужно добавить ? Или не будут работать ПАПКИ с русскими именами ?

Pasha: В харборе допускаются русские имена файлов и папок. Андрей, нужен контекст. Кодовая страница, как я понимаю, выставлена RU1251 ? cFileSave в какой кодовой странице ? Далее, еще раз. Харбор в поставке minigui уникодный ? Далее. Насколько я помню, в поставке minigui идет своя версия библиотеки hbole, которая по сути есть очень устаревший на много-много лет вариант оригинальной библиотеки харбора. Лучше использовать не ее, а оригинальную библиотеку. А самым лучшим решением было бы исключить эту библиотеку из поставки minigui, и использовать оригинальную. Кстати, если выполнить этот код с харбором не из поставки minigui, думаю, проблем не возникнет. Во всяком случае, у меня проблем с передачей русских имен файлов в продукты office через ole нет.

Andrey: Pasha пишет: Кодовая страница, как я понимаю, выставлена RU1251 ? cFileSave в какой кодовой странице ? 1) Да ! 2) если файл в RU1251 тогда cFileSave тоже должна быть в RU1251 или надо как то по другому задавать ? Pasha пишет: Далее, еще раз. Харбор в поставке minigui уникодный ? Не знаю. Нужно у Григория спрашивать... Залез в папку с Харбором - Version: 3.2.0dev (r1709261254) Pasha пишет: Далее. Насколько я помню, в поставке minigui идет своя версия библиотеки hbole, которая по сути есть очень устаревший на много-много лет вариант оригинальной библиотеки харбора. Лучше использовать не ее, а оригинальную библиотеку. А самым лучшим решением было бы исключить эту библиотеку из поставки minigui, и использовать оригинальную. Нет сейчас в поставке hbole.lib в папке MiniGUI\Lib Берется из стандартой поставки MiniGUI\Harbour\lib\hbole.lib В папке Харбора такое написано: - hbole.lib: Harbour OLE Library. Part of xHarbour core Copyright 2002 Jose F. Gimenez <jfgimenez@wanadoo.es> Source code available in the folder \source\HbOLE. Вот у SergKis цифирьки ошибки немного другие: Error 8198764/-2147352573 DISP_E_MEMBERNOTFOUND: SAVEAS

Pasha: Ну как бы из приведенного примера не видно, как заполняется cFileSave. Лучше проверить, и убедиться, что кодировка та, что надо. А в харборе модуль работы с ole находится в библиотеке hbwin, так что hbolе наверняка его устаревшая версия из поставки minigui.

Pasha: Немного разобрался. Харбор из поставки минигуи уникодный, но сам минигуи не уникодный. Библиотека hbole.lib собрана из модуля 2009 года. Однако, 8(!) лет прошло. /* * $Id: win_ole.c 11529 2009-06-26 01:11:11Z vszakats $ */ Но в поставку харбора также включена уникодная библиотека hbwin со свежим модулем ole. Лучше конечно использовать его. Надо убрать hbole.lib из батников сборки проекта, добавить вместо нее hbwin.lib, и вместо oExcel := TOleAuto():New( "Excel.Application" ) вызывать oExcel := win_oleCreateObject("Excel.Application") и ПРОВЕРИТЬ (три, а лучше семь раз), кодировку переменной cFileSave Дополню: hbole.lib из сборки убрать не получится, так как этот класс использует TSBrowse. Тогда пусть в сборке будут обе библиотеки.

Andrey: Pasha пишет: Надо убрать hbole.lib из батников сборки проекта, добавить вместо нее hbwin.lib, и вместо oExcel := TOleAuto():New( "Excel.Application" ) вызывать oExcel := win_oleCreateObject("Excel.Application") Да мне Петр давно советовал уйти с hbole.lib, а я всё никак не решусь. Код перестаёт работать... Как делать - не знаю...

Pasha: Скачиваю hmg-17.09.7z Собираю пример из samples\applications\DBFview\source Запускаю dbfview, открываю файл dbf. Жму File - SaveAs/Export Выбираю формат xls, ввожу имя файла по русски Файл успешно сохраняется. Смотрю сырцы. Там маленькая процедура: Static Procedure SaveToXls( cAlias, cFile ) *--------------------------------------------------------* Local oExcel, oSheet, oBook, aColumns, nCell := 1 oExcel := TOleAuto():New( "Excel.Application" ) if Ole2TxtError() != 'S_OK' MsgStop('Excel is not available!', PROGRAM ) RETURN endif oExcel:Visible := .F. oExcel:WorkBooks:Add() oSheet := oExcel:Get( "ActiveSheet" ) Aeval( (cAlias)->( DBstruct(cAlias) ), { |e,i| oSheet:Cells( nCell, i ):Value := e[DBS_NAME] } ) do while !(cAlias)->( EoF() ) nCell++ aColumns := (cAlias)->( Scatter() ) aEval( aColumns, { |e,i| oSheet:Cells( nCell, i ):Value := e } ) (cAlias)->( DBskip() ) enddo oBook := oExcel:Get("ActiveWorkBook") oBook:Title := cAlias oBook:Subject := cAlias oBook:SaveAs(cFile) oExcel:Quit() Return Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать.

Andrey: Pasha пишет: Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать. Сделал папку D:\TEMP2_Русские_Буквы\Проверка букв\Тест новый - запускаю Xls_to_Csv.exe, xls-файл создаёт... В папке где собраны все мои проекты подключаю через SUBST - вот там эта программа xls-файл НЕ СОЗДАЁТ !!! Блин... Опять Win8.1 ставит подножку на пустом месте...

Pasha: Комментирую фрагмент в этой функции /* oExcel := TOleAuto():New( "Excel.Application" ) if Ole2TxtError() != 'S_OK' MsgStop('Excel is not available!', PROGRAM ) RETURN endif */ вместо него добавляю: oExcel := win_oleCreateObject( "Excel.Application" ) собираю, делаю тоже самое. Работает. И со старой библиотекой hbole, и с новой hbwin. Ну хоть ты тресни, никак сломать не получается.

Pasha: А сам Excel сохраняет файлы на сабстнутый диск ?

Andrey: Pasha пишет: А сам Excel сохраняет файлы на сабстнутый диск ? Да. Даже если обозвать папку \PROJECT\XLS_to_CSVII_Русские_буквы А функция MyCreateNewXls(cFileName) - вылетает, хотя код и там и там почти одинаковый.... Короче что-то с доступом к папке...

Andrey: Вот так поставил: [pre2] cTitle := "Тестовая таблица для конвертирования Xls в Csv" ...... oWorkBook := oExcel:Get("ActiveWorkBook") oWorkBook:Title := cTitle oWorkBook:Subject := cTitle oWorkBook:SaveAs( cFileName, xlWorkbookNormal ) // #include "excel.ch" oExcel:Quit()[/pre2] и стал записываться xls-файл в папку \PROJECT\XLS_to_CSVII_Русские_буквы где SUBST назначен. Не хватало 3-х строчек кода ! СЛЕДУЮЩИЙ ВЫВОД ПРАВИЛЬНЫЙ : Pasha пишет: Вывод: все работает и с библиотекой hbole.lib. Только надо не лажануться и все правильно сделать. Спасибо БОЛЬШОЕ за наводку !

Pasha: Буквально позавчера делал заполнение бланка в Excel. Там всего лишь вставляется табличка, после которой идут подписи. Так вот, после заполнения таблички высота нескольких строк в подписи сама собой увеличилась, и стала где-то на полметра. Почему Excel решил так сделать - фиг его знает. Я так и не разобрался.



полная версия страницы