powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование через буфер в excel
28 сообщений из 28, показаны все 2 страниц
Копирование через буфер в excel
    #32696905
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация такая. Есть таблица, в которую заносятся записи в несколько полей. Возможно ли вставить в открытую foxoвскую таблицу скопированные (ctrl+c) ячейки из excel-документа? Или есть какие-то другие варианты? Если можно, то как этого добиться. Если я не смогу сделать этого до сегодняшних 2 дня, то вся моя работа пойдет на смарку, придется переписывать прогу под Access. Жаль будет... :( Народ, помогите, пожалуйста.
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32696971
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем конкретно вы занимаетесь
что хотите сделать
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32696975
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одну ячейку можно вставить. А механизма групповой вставки сразу в несколько строк или полей из буфера обмена в FoxPro не предусмотрено.

Ну, разве что, программный разбор содержимого буфера обмена (содердимое переменной _ClipText)

Переписывай под Access! Только не плачь
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697004
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть dbf-таблица, в нее будут забиваться данные. Я открываю ее в гриде. В эту таблицу должны заноситься данные. Некоторые позиции вносятся вручную. А некоторые должны просто копироваться из excel и вставляться в эту таблицу. Копироваться для того, чтобы облегчить работу по забиванию таблицы, многие данные уже предоставлены на совершенно разных документах excel. То есть для каждого excel-документа в отдельности нет возможности конвертировать данные в dbf, потому что документы совершенно разного формата, нужно копировать только какую-то часть этого документа, которая должна выбираться непосредственно пользователем, представления о том, что он будет копировать в grid нет (но это однозначно ячейка(ячейки) excel). Как оформить это копирование в мою таблицу. И есть ли возможность максимально упростить эту операцию (По типу скопировал ячейки в excel, выбрал поле в gride, нажал вставить, и данные из excel автоматически вставляются в тем же блоком в мою таблицу)
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697008
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да..., пустить под access месяц работы в fox pro...
Может, все таки есть варианты?
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697015
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да..., пустить под access месяц работы в fox pro...
Может, все таки есть варианты?
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697048
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не лучший вариант но просто ничего в голову не идет
создаете excel объект в фоксе открываете все нужные таблицы
на форме ставите кнопку копия из ексель
при нажатии на кнопку копируеться значение из активной ексель таблицы и активного поля в фокс а затем обрабатываеться
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697075
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как раз сейчас этим и занимаюсь. Только как скопировать данные допустим выделенных 9 ячеек excel (3 на 3) в соответствующие 9 полей (те же 3 на 3) грида?
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697085
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну Вам же сказали никак
копируйте по одной
или можно обрабатывать выбранный диапазон правда таблицы разные и я так понял что общего правила нет
а по какому принципу фокс должен сообразить как ему разбить строку буфера и что куда вставлять
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697142
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, уже сижу с 1000страничной книжищей access для профессионалов. Обломалась моя работа, придется все переделывать.
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697173
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно предложить такой вариант - получаем в массив выделенный в текущей Экселевской книге диапазон:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Local loExcel
DIMENSION laArray( 10 , 10 )
lcOldError=On("ERROR")
on error loExcel=.NULL.
loExcel=GetObject(,"Excel.Application")
on error &lcOldError
if isnull(loExcel)
	= MESSAGEBOX('Excel закрыт')
ELSE
	WITH loExcel
		laArray = .Selection.Value
	ENDWITH
ENDIF
Ну а дальше этот массив можно пихнуть и в таблицу :)
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697275
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного исправленный вариант с определением размерности выделенной области:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
lcOldError=On("ERROR")
on error loExcel=.NULL.
loExcel=GetObject(,"Excel.Application")
on error &lcOldError
if isnull(loExcel)
	= MESSAGEBOX('Excel закрыт')
ELSE
	WITH loExcel
		X = .Selection.Columns.Count
		Y = .Selection.Rows.Count
		DIMENSION laArray(X,Y)
		laArray = .Selection.Value
	ENDWITH
ENDIF
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697434
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно, а как теперь определенным полям foxproшной таблицы задать значения этого массива?
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697462
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как угодно
scatter например
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697475
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то типа:
Код: plaintext
1.
2.
3.
4.
FOR lnCount =  1  TO X
REPLACE table.field1 WITH laArray(lnCount, 1 ),;
	     table.field2 WITH laArray(lnCount, 2 )
SKIP
ENDFOR
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697484
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуста, у меня пожар. Язык знаю не очень хорошо, времени разбираться просто нет. Как из этого массива данные добавить в таблицу?
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697544
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почуму так мрачно?...

Я делал вставку данных из таблиц Word.
делал я так:
GETOBJECT(,"Word.Application") или CreateObject(...)
oDoc=createobject(,"Word.Document)
в тот документ вставляем из буфера oDoc.Selection.Paste

rCount=oDoc.tables.item(1).Rows.count
cCount=oDoc.tables.item(1).Columns.count
for i=1 to rCount
for j=1 to cCount
r[j]=SUBSTR(oDoc.tables.item(1).cell(i,j).range.text,1,LEN(oDoc.tables.item(1).cell(i,j).range.text)-2)
....

Ну а для Excel тоже иожно єто сделать...
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697806
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собрав всё вместе получим такую процедурку на клик кнопки или иное событие по которому происходит перенос данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
lcOldError=On("ERROR")
on error loExcel=.NULL.
loExcel=GetObject(,"Excel.Application")
on error &lcOldError
if isnull(loExcel)
	= MESSAGEBOX('Excel закрыт')
ELSE
	WITH loExcel
		X = .Selection.Columns.Count
		Y = .Selection.Rows.Count
		DIMENSION laArray(X,Y)
		laArray = .Selection.Value
	ENDWITH
ENDIF

SELECT Table &&Источник для грида
FOR lnCount =  1  TO X
REPLACE Table.field1 WITH laArray(lnCount, 1 ),;
	     Table.field2 WITH laArray(lnCount, 2 ),;
              ......
	     Table.fieldY WITH laArray(lnCount,Y)
SKIP
ENDFOR
Есть ограничения:
1) Пользователь должен так выбирать диапазон, чтобы колонок было именно Y и они соответствовали полям баз. Можно конечно определить в какой колонке грида стоит пользователь, но могут возникнуть сложности с типом данных- смотри пункт ниже.
2)Из экселя все данные получаются строкового типа, поэтому в Replace надо для этих полей выполнить преобразование (заменить laArray(x,y) допустим VAL(laArray(x,y)))
3) Диапазон, выделенный в Экселе при переносе не должен достигнуть конца таблицы.
Все эти проблемы можно решить. Но вам виднее что легче в данной ситуации - решать их или поставить пользователя в рамки.
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697913
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе после создания массива из excel я дописывал
APPEND FROM ARRAY laArray FIELDS field1, field2, field3, ...
И нужные поля заполнялись.
А на вариант
FOR lnCount = 1 TO y
REPLACE zakupka.field1 WITH laArray(lnCount,1)
REPLACE zakupka.field2 WITH laArray(lnCount,2)
......
REPLACE zakupka.fieldy WITH laArray(lnCount,y)
SKIP
ENDFOR
ругается, выдает несколько раз ошибку несовпадение типа данных
А как можно выделить несколько ячеек грида?
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697949
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите, немного непонял - Append from - добавляет новые строки, я думал вам в уже добавленных надо данные подставлять.
А если добавляются новые строки, то зачем выделять несколько ячеек?
Всё равно в конец таблицы всё добавится независимо от выделения.
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32697974
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если нужно добавлять то используте
append blank a не skip
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32698002
xamlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть порядка 20 полей в таблице. Данные вставляются блоком (из созданного массива) Как добиться того, что бы блок данных вставлялся начиная с выделенного места таблицы (например сейчас выделена 3 строка поля field3. В массиве содержится 2 на 2 excelевские ячейки , мне нужно, чтобы они вставились в 3 и 4 строку полей field3 и field4) Append пришлось использовать, потому что с replace пока не получается. Вот такая ситуация. Это последнее, что мне осталось написать, что бы выполнить все требования, можно ли такого добиться? Извиняюсь, за кривую постановку вопроса, опыт написания на foxe очень маленький.
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32698035
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
APPEND FROM ARRAY ArrayName
[FOR lExpression]
[FIELDS FieldList]
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32698038
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GATHER FROM ArrayName | MEMVAR | NAME ObjectName
[FIELDS FieldList | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]
[MEMO]
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32698047
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INSERT [BEFORE] [BLANK]
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32698105
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во это наверно тебе подойдёт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT Table
DIMENSION laArray2(Y)
FOR lnCount =  1  TO X
FOR lnCOunt1=  1  TO Y 
	laArray2(lnCount1)= laArray(lnCount,lnCount1)
ENDFOR
 GATHER FROM laArray2 FIELDS field1,field2
 SKIP
ENDFOR
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32698137
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select t1
nn=recno()
insert before nn
gather from array
...
Рейтинг: 0 / 0
Копирование через буфер в excel
    #32700326
akrisiun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
Vot moij kod (sorry for lattin)  :

* Simple import from XLS via clipboard buffer 

IF VERSION( 5 ) <  800  
   ERROR "Need VFP8  for ALINES , INSERT  INTO  ( )   SELECT ... statments "
   RETURN .F.
ENDIF

CREATE CURSOR cFromXls( Str M ) 

LOCAL lnI, lnCnt
lnCnt =ALINES( aBuff, GetClipData() ) 


* INSERT INTO cFromXls FROM ARRAY aBuff  - not works - only single row inserted :( 
 FOR lnI =  1  TO lnCnt 
   INSERT INTO cFromXls ( STR ) VALUES ( aBuff[ lnI ] ) 
 ENDFOR    

CREATE CURSOR cColumns( Str M, Col1 C( 20 ), Col2 C( 20 ), Col3 C( 20 ) )

#DEFINE PARSECHAR CHR( 9 ) 

INSERT INTO cColumns( Str, Col1, col2, col3 ) ;
  SELECT Str, STREXTRACT( Str, "", PARSECHAR ) ;
    , STREXTRACT( Str, PARSECHAR, PARSECHAR  ) ;
    , STREXTRACT( Str, PARSECHAR , PARSECHAR,  1  ) ;
   FROM cFromXLs  


* ClipF.prg file : Clipboard functions 

*####################################################################################
FUNCTION GetClipData          
 LOCAL loClip
 loClip = NEWOBJECT( "ClipboardObj" )
 RETURN loClip.GetClipData() 

*####################################################################################
FUNCTION SetClipData
 LPARAMETERS lcText
 *LOCAL loClip
 *loClip = NEWOBJECT( "ClipboardObj" )
 *RETURN loClip.SetClipData( lcText )      &&- busz DIB formatu
 _CLIPTEXT = lcText 
RETURN .T.  


*####################################################################################
**************************************************
DEFINE CLASS ClipboardObj AS Custom 
*####################################################################################

#UNDEFINE CF_TEXT           
#UNDEFINE CF_OEMTEXT        
#UNDEFINE CF_UNICODETEXT    
#UNDEFINE CFSTR_OLEVARIANTARRAY
#UNDEFINE CFSTR_OLEVARIANT   

#DEFINE CF_TEXT             1 
#DEFINE CF_OEMTEXT          7 
#DEFINE CF_UNICODETEXT     13 
#DEFINE CFSTR_OLEVARIANTARRAY "OLE Variant Array"
#DEFINE CFSTR_OLEVARIANT      "OLE Variant"
#DEFINE GMEM_DDESHARE  0x2000

 #DEFINE MAXSTRSIZE       0xFFF0    &&  = 65520 

 pClipMemory = .NULL.
 hClipMemory = .NULL.
 nMaxSize    = MAXSTRSIZE
 String = ''
 nFormat = CF_TEXT
 nRetVal   =  0 
 cErrorStr = ""
 
 FUNCTION Init 
   This.Declare() 
   
*####################################################################################
 FUNCTION Declare
     * -- DECLARE Windows API functions for this module 
     DECLARE INTEGER OpenClipboard    IN user32 INTEGER
     DECLARE INTEGER CloseClipboard   IN user32
     DECLARE INTEGER GetClipboardData IN user32 INTEGER
     DECLARE INTEGER SetClipboardData IN user32 INTEGER, INTEGER 
     DECLARE INTEGER GlobalAlloc      IN kernel32 INTEGER, INTEGER
     DECLARE INTEGER GlobalLock       IN kernel32 INTEGER
     DECLARE INTEGER GlobalUnlock     IN kernel32 INTEGER
     DECLARE INTEGER lstrcpyn IN kernel32  ;
             STRING @ lpStrTarget,  INTEGER  lpStrSource, INTEGER iMaxLength 
     DECLARE INTEGER lstrcpyn IN kernel32  AS lstrcpyn2 ;
             INTEGER  lpStrTarget,  STRING @ lpStrSource, INTEGER iMaxLength 
     DECLARE INTEGER GlobalSize       IN kernel32 INTEGER, INTEGER 
     DECLARE INTEGER IsClipboardFormatAvailable  IN user32 INTEGER

*####################################################################################
 FUNCTION GetString
   LPARAMETERS tcStr 
   WITH This 
      LOCAL lcString, lnRetVal 
      lcString = "" 
      * -- Lock clipboard memory so we can reference 
      * -- the actual data string 
      .pClipMemory = GlobalLock( .hClipMemory )
      * -- Copy string from clipboard to local variable 
      IF NOT ISNULL( .pClipMemory )
           lcString = SPACE( .nMaxSize ) + " "
           lnRetVal = lstrcpyn( @lcString, .pClipMemory, .nMaxSize -  1  )
           lnRetVal = GlobalUnlock( .hClipMemory )
           .hClipMemory = .NULL.
           
           * -- peel off the null terminating character. 
           lcString = SUBSTR( lcString,  1  ;
                              , AT( CHR( 0 ), lcString ) -  1  )
           RETURN lcString
      ENDIF
      RETURN ""       
   ENDWITH    

*####################################################################################
 FUNCTION GetClipData 
   WITH This 
       * -- Check to see if there is any text available for pasting 
       IF IsClipboardFormatAvailable( CF_TEXT ) <>  1 
          .cErrorStr = "No text available in the clipboard right now."
         RETURN ""
       ENDIF
       * -- Try to open the clipboard 
       IF OpenClipboard( 0 ) =  0 
          .cErrorStr = "Could not open the Clipboard. " ;
                     + "Another application may have it open"
           RETURN ""
       ENDIF
       LOCAL lcString 
       lcString = ""
       * -- obtain the handle to the global memory 
       * -- block that is referencing the text 
       .hClipMemory = GetClipboardData( CF_TEXT )
       IF ISNULL( .hClipMemory )
          .cErrorStr = "Could not allocate memory"
       ELSE
          lcString = .GetString( lcString ) 
          * -- Close the clipboard and return 
       ENDIF 
       .nRetVal = CloseClipboard()
       RETURN( lcString )
     ENDWITH  

*####################################################################################
 FUNCTION PutString
   LPARAMETERS tcString 
   WITH This 
      * -- Lock clipboard memory so we can reference 
      * -- the actual data string 
      lcString  = ( tcString + CHR( 0 ) )
      .nFormat  = CF_TEXT 
      * CF_OEMTEXT    CF_UNICODETEXT   CFSTR_OLEVARIANT      

      .nMaxSize  = LEN( lcString ) -  1  

      .pClipMemory = GlobalAlloc( GMEM_DDESHARE, .nMaxSize +  1  )
      * -- Copy string from clipboard to local variable 
      IF NOT ISNULL( .pClipMemory )
           .hClipMemory = GlobalLock( .pClipMemory )
           lnRetVal = lstrcpyn2( .pClipMemory, @lcString, .nMaxSize )
           lnRetVal = GlobalUnlock( .hClipMemory )

           lcString = SPACE( .nMaxSize ) + " "
           lnRetVal = GlobalUnlock( .hClipMemory )

           .hClipMemory = .NULL. 
           * -- peel off the null terminating character. 
           RETURN .T.
      ENDIF
      RETURN .T. 
   ENDWITH    

*####################################################################################
  FUNCTION SetClipData 
    LPARAMETERS lcString 
     
     WITH This  
       .nRetVal =  0 
       IF OpenClipboard( 0 ) =  0 
          .cErrorStr = "Could not open the Clipboard. " ;
                     + "Another application may have it open"
          RETURN .nRetVal 
       ENDIF
       .pClipMemory = .NULL.
       IF ! .PutString( lcString ) 
           .cErrorStr = "Could not allocate memory"
           SetClipboardData( CF_TEXT,  0  ) 
       ELSE  
          IF ISNULL( .pClipMemory )  
             .cErrorStr = "Could not allocate memory"
          ELSE
             * TODO: convert OEMTEXT to widechar, unicode 
             *  alia : SetClipboardData( CF_TEXT,  .pClipMemory )

             SetClipboardData( CF_TEXT,  0  ) 
             SetClipboardData( .nFormat, .pClipMemory )
            .nRetVal =  1 
          ENDIF
       ENDIF 
       CloseClipboard()
       RETURN .nRetVal 
     ENDWITH 
     
ENDDEFINE 

...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование через буфер в excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]