purebasic.info

PureBasic forum
Текущее время: Вс дек 16, 2018 7:00 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Ср окт 23, 2013 10:11 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
а как графе формат выбрать? числовой, текстовой и так далее?
в константах вроде упоминается:
Код:
1
2
3
4
5
6
7
8
9
10
11
;-XlColumnDataType
#xlDMYFormat =  4
#xlDYMFormat =  7
#xlEMDFormat =  10
#xlGeneralFormat =      1
#xlMDYFormat =  3
#xlMYDFormat =  6
#xlSkipColumn =         9
#xlTextFormat =         2
#xlYDMFormat =  8
#xlYMDFormat =  5


но к какой они функции прилагаются то?

XLSFunc_SetCellFormat(ExcelFile, "C", "") вроде как подходит, но оно просто дает имя новому формату так сказать... там есть такой пункт "другие" и вот туда добавляет то, что я туда вобью. но мне надо пункт "текстовой" или "числовой", а не "другой".


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Ср окт 23, 2013 10:34 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
ага... походу текстовой так: XLSFunc_SetCellFormat(ExcelFile, "C", "@")


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Вт окт 29, 2013 7:12 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
не нашел функции переименования листа в документе. есть только создание нового с необходимым именем - Procedure XLSFunc_AddWorksheetAfter(ExcelObject.COMateObject, NewSheetName.s = "");New Worksheet after last Worksheet

коим образом выкрутится? вариант через задний проход не очень - удалить все листы в документе и создать новый с нужным именем. хотелось бы видеть что-то типа XLSFunc_GetSheetName, только наоборот для установки имени типа XLSFunc_SetSheetName

не совсем понимаю структуру этих коматов и сам правильно написать функцию не смогу :) посодействуйте!
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure XLSFunc_AddWorksheetAfter(ExcelObject.COMateObject, NewSheetName.s = "");New Worksheet after last Worksheet
  ; Thanks Kiffi for your help to this Function AddWorksheetAfter
  Protected LastSheet.COMateObject, NewSheet.COMateObject
 
  ; Letztes Sheet ermitteln
  LastSheet = ExcelObject\GetObjectProperty("Sheets(" + Str(ExcelObject\GetintegerProperty("Sheets\Count")) + ")")
 
  ; Neues Sheet hinter dem letzten Sheet erstellen
  NewSheet = ExcelObject\GetObjectProperty("Sheets\Add(#Optional, " + Str(LastSheet) + " As COMateObject)")
 
  ; Optional: Namen des neuen Sheets setzen
  If NewSheetName <> ""
    NewSheet\SetProperty("Name = '" + NewSheetName + "'")
  EndIf
 
  ; NewSheet-Objekt freigeben
  NewSheet\Release()
   
  ; LastSheet-Objekt freigeben
  LastSheet\Release()
 
EndProcedure



SetProperty("Name = '" + NewSheetName + "'") - понятно, а вот как добыть NewSheet - только не новый, то есть +1 к имеющимся, а именно старый под номером 1, 2 или 3?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Ср окт 30, 2013 10:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 933
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
SereZa писал(а):
не нашел функции переименования листа в документе

Попробуй:
XLSFunc_RenameActiveSheet(MyExcelFile1,"Name")


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Чт окт 31, 2013 1:11 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
опля... я же поиском искал любые Rename и не нашел :)))) спасибо!

аааа! еще момент - надо ли как-то освобождать хендл или кто он там - MyExcelFile1 после окончания использования?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Чт окт 31, 2013 2:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 933
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
SereZa писал(а):
еще момент - надо ли как-то освобождать хендл или кто он там - MyExcelFile1 после окончания использования?


Если данная книга (файл Excel) больше не нужна, то ее надо закрыть:
XLSFunc_CloseWorkbook(ExcelFile1)

В конце программы надо сделать:
XLSFunc_CloseExcelAll(ExcelFile1)
чтобы процесс excel.exe не остался висеть в памяти.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Чт окт 31, 2013 2:34 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
так после этих команд ExcelFile1 все равно содержит какое-то значение.

проверял так:
Debug ExcelFile1
XLSFunc_CloseWorkbook(ExcelFile1)
Debug ExcelFile1
XLSFunc_CloseExcelAll(ExcelFile1)
Debug ExcelFile1


также с этими командами, в купе с сохранением есть одна небольшая проблема:
XLSFunc_SaveAsWorkbook(ExcelFile1,FileName,#xlNormal)
XLSFunc_CloseWorkbook(ExcelFile1)
XLSFunc_CloseExcelAll(ExcelFile1)
в случае если файл существовал, то XLSFunc_SaveAsWorkbook выдаст диалог - перезаписать? и пользователь выберет нет или отмену, то последующая XLSFunc_CloseWorkbook(ExcelFile1) опять выбьет диалог сохранения. что может несколько спутать пользователя...

я бы наверное сделал следующее:
добавил ProcedureReturn для XLSFunc_SaveAsWorkbook
Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure.i XLSFunc_SaveAsWorkbook(ExcelObject.COMateObject,Datei.s,FFormat)
  Protected Workbook.COMateObject
  Workbook=ExcelObject\GetObjectProperty("ActiveWorkbook")
  If Workbook
    ;Workbook\Invoke("SaveAs('"+Datei+"')") ; replace this with Filefomat for another Formats (12.03.2011) for Excel < 2007 with next line
    result = Workbook\Invoke("SaveAs('"+Datei+"', " + Str(FFormat) + ")") ;Save As #xlNormal or #xlCSV or another CSV (MSDOS or Windows)
    Workbook\Release()     ;Workbook Freigeben
  EndIf
 
  ProcedureReturn result
 
EndProcedure


если пользователь выбрал в том диалоге с перезаписью ДА - то вернет 0. если НЕТ - то отрицательное число. и уже в зависимости от этого производить XLSFunc_CloseWorkbook при успешном сохранении, или если была отмена сохранения, то добавить нечто типа XLSFunc_ForseCloseWorkbook - то есть насильное закрытие документа без сохранения, чтобы не выводило тот повторный диалог.

но этого делать не умею :) и мой вариант пока отказаться от использования XLSFunc_SaveAsWorkbook, по окончанию вписыванию всей таблицы производить отображение документа XLSFunc_ExcelVisible(ExcelFile,#True) и момент сохранения и закрытия документа уже оставлять на совесть пользователя.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Пт ноя 01, 2013 9:12 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 933
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Я этот вопрос тоже не до конца понимаю, но по моему XLSFunc_CloseExcelAll(ExcelFile1) работает как форсированный выход без сохранения.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Сб ноя 02, 2013 1:21 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
неа. также.
Код:
1
2
3
XLSFunc_SaveAsWorkbook(ExcelFile1,FileName,#xlNormal) ; если файл существует и появится окно "перезаписать" - выбрать нет.
;XLSFunc_CloseWorkbook(ExcelFile1)
XLSFunc_CloseExcelAll(ExcelFile1) ; выбьет предложение "сохранить Книга1.xls?"



этот XLSFunc_CloseExcelAll не столько forse, сколько задуман как полностью закрытие программы ексель, соответственно все открытые документы в этом окне екселя, где были какие-то изменения, повыбивают диалоги на сохранение.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Пт июн 27, 2014 12:53 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 933
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Обнаружил, что файл открытый в одном потоке нельзя использовать в другом потоке.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Вс фев 22, 2015 9:34 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
вопрос: а можно открытый ексель перехватывать? как бы стартовать чтение уже запущенного екселя, а не запускать каждый раз.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Пн фев 23, 2015 12:54 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 933
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Я сталкивался с такой проблемой.
Файл xls открыт пользователем, в это время программа на PB открывает его читает/пишет и закрывает. Это приводит к тому, что появляются зависшие процессы EXCEL, в количестве равном числу раз использования файла.

В общем: одновременно файл должен использоваться только одним процессом, иначе возникают глюки.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Пн фев 23, 2015 10:11 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
22vlad, а так пробывал?

excel.COMateObject = XLSFunc_OpenExcelFile(FileName)
блаблаблабла
excel\Release()

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Вт мар 17, 2015 10:12 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
избавляюсь от открытого ексель файла, в котором только читал так:
Код:
1
2
excel\Invoke("Quit()")
excel\Release()



однако если в ексель что-то писалось, то этот excel\Invoke("Quit()") выдаст запрос - сохранить изменения? как бы закрыть ексель насильно? без этого запроса? типа варианта "закрыть не сохраняя". нет ли такой команды в этом Invoke?

вот тут что-то нашлось:
ActiveWorkbook.Close savechanges:=False ( http://forum.codenet.ru/q12524/ )
как теперь это применять то? :)
Код:
1
2
3
4
5
  Workbook=ExcelFile\GetObjectProperty("ActiveWorkbook")
  If Workbook
    Workbook\Invoke("Close"); Close Excel Worksheet
    Workbook\Release() ;Workbook freigeben
  EndIf


Workbook\Invoke("Close") как этой команде параметры указать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Библиотека для работы с Excel
СообщениеДобавлено: Ср мар 18, 2015 8:33 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
ну подскажите :) не получается нифига :) посмотрел уже и в комате:
Invoke.i(command$, *hStatement=0) ;Returns a HRESULT value. #S_OK for no errors.

значит команда должна выглядеть что-то типа такого:
Код:
1
2
3
4
5
6
7
8
  Workbook=ExcelFile\GetObjectProperty("ActiveWorkbook")
  If Workbook
    tmp$ = "SaveChanges := #False"
    *MemoryBuffer = AllocateMemory(100)
    PokeS(*MemoryBuffer, tmp$);, 100, Flags]])
    Workbook\Invoke("Close", *MemoryBuffer)
    Workbook\Release() ;Workbook freigeben
  EndIf



только нифига. вроде тут смотрю это должен быть указатель на структуру: *statement._COMatePLUSStatement

а значит нифига не PokeS.

сама она выглядит так:
Код:
1
2
3
4
5
6
    Structure _COMatePLUSStatement
      numSubObjects.i
      methodName.i[#COMate_MAXNUMSUBOBJECTS+1]  ;1-based indexing. BSTRs.
      numArgs.i[#COMate_MAXNUMSUBOBJECTS+1]     ;1-based indexing.
      ptrVarArgs.i[#COMate_MAXNUMSUBOBJECTS+1]  ;1-based indexing.
    EndStructure



только все параметры .i - куда я буду этот долбанный параметр "SaveChanges := #False" вписывать?



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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB