Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294


К сообщению приложен файл. Размер - 8Kb
11 июл 12, 11:31    [12849357]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,
loWord.TypeText("так пишется текст") && переменные, поля здесь никто не отменял
loWord.ActiveDocument.Tables.Add(.Range,1,2) && создание таблицы 1х2
11 июл 12, 12:21    [12849735]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,
loTable=.ActiveDocument.Tables(1)
.Selection.MoveDown(wdCell)   && переход нижней ячейке/на новую строку
Это только кусочек из кода, допили...
11 июл 12, 12:24    [12849769]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Jonny540,

Не допилю))), я спал всего один час и плохо соображаю, если не затруднит для моего случая:
	loWordTab = loWord.ActiveDocument.Tables.Add(loWord.Selection.Range,3,2)
	WITH loWord.Selection.Tables(1)
		.Columns(1).Width = 200
		.Columns(2).Width = 200
		.rows(1).Height = 20
		.rows(2).Height = 20
		.rows(3).Height = 20
		.Style = "Сетка таблицы"
		.Cell(1,1).Range.Text = "R1C1"
		.Cell(1,1).VerticalAlignment = wdCellAlignVerticalCenter
		.Cell(1,2).Range.Text = "R1C2"
		.Cell(1,2).VerticalAlignment = wdCellAlignVerticalCenter
		.Cell(2,1).Range.Text = "R2C1"
		.Cell(2,1).VerticalAlignment = wdCellAlignVerticalCenter 
		.Cell(2,2).Range.Text = "R2C2"
		.Cell(2,2).VerticalAlignment = wdCellAlignVerticalCenter 
		.Cell(3,1).Range.Text = "R3C1"
		.Cell(3,1).VerticalAlignment = wdCellAlignVerticalCenter 
		.Cell(3,2).Range.Text = "R3C2"
		.Cell(3,2).VerticalAlignment = wdCellAlignVerticalCenter
	ENDWITH 
11 июл 12, 12:55    [12850065]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Виноват, вот так надо:
.Selection.MoveDown(wdLIne,2)   && на новую строку, если в предпоследней строке таблицы
11 июл 12, 13:01    [12850119]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,
Извини, но тебе лучше всего поспать минут 600...
11 июл 12, 13:28    [12850338]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Jonny540,

Спс, но может лучше для моего случая, а то ни как. То не правильное имя то Selection не является объектом. плиз!!!
11 июл 12, 13:41    [12850434]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,

ну дык опиши конкретно, что надо.. из примера можно только понять, ты ворд с екселем перемешал
11 июл 12, 14:00    [12850558]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Jonny540,

В целом мне нужна таблица. Таблица будет заполняться через SCAN?
Но при заполнении через SCAN нельзя присвоить шапку таблице (т.к. она будет повторяться) и заполнять поля.
Я пришел к выводу что сделаю две таблицы, с начала таблицу «шапку», потом перейду на следующую строку и создам новую таблицу которая будет заполняться через SCAN.
loWordTab = loWord.ActiveDocument.Tables.Add(loWord.Selection.Range,1,3)
	WITH loWord.Selection.Tables(1)
		.Columns(1).Width = 200
		.Columns(2).Width = 200
		.rows(1).Height = 20
		.rows(2).Height = 20
		.rows(3).Height = 20
		.Style = "Сетка таблицы"
		.Cell(1,1).Range.Text = "№ п/п"
		.Cell(1,1).VerticalAlignment = wdCellAlignVerticalCenter
		.Cell(1,2).Range.Text = "Количество"
		.Cell(1,2).VerticalAlignment = wdCellAlignVerticalCenter	
		.Cell(1,3).Range.Text = "Сумма"
		.Cell(1,3).VerticalAlignment = wdCellAlignVerticalCenter		
	ENDWITH 

*loWord.Tables(1).Selection.MoveDown(wdLIne,2)   && переход на следующую строку 

SELECT Kard
SCAN
loWordTab = loWord.ActiveDocument.Tables.Add(loWord.Selection.Range,1,3)
	WITH loWord.Selection.Tables(1)
		.Columns(1).Width = 200
		.Columns(2).Width = 200
		.rows(1).Height = 20
		.rows(2).Height = 20
		.rows(3).Height = 20
		.Style = "Сетка таблицы"
		.Cell(1,1).Range.Text = Kard.numb
		.Cell(1,1).VerticalAlignment = wdCellAlignVerticalCenter
		.Cell(1,2).Range.Text = Kard.kol
		.Cell(1,2).VerticalAlignment = wdCellAlignVerticalCenter			
		 .Cell(1,3).Range.Text = Kard.Sum
		.Cell(1,3).VerticalAlignment = wdCellAlignVerticalCenter		
	ENDWITH 
ENDSCAN
11 июл 12, 14:24    [12850788]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
gore-egor
Member

Откуда:
Сообщений: 79
Aleks_Aleks,

Извини, фигня. Шапку тебе никто не мешает делать сразу после создания файла.
Ну а дальше - SCAN , заполнение ячеек таблицы ворда в цикле....
В чем проблема-то?
Я тоже не спал, вообще, и чё???
И что такое R1C1?
11 июл 12, 16:39    [12851863]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Aleks_Aleks,

Спасибо Jonny540! Только надо было подтолкнуть меня, а то я сонный не допилил.
Вот так у меня будет правильно:

	loWordTab = loWord.ActiveDocument.Tables.Add(loWord.Selection.Range,1,3)
	WITH loWord.Selection.Tables(1)
		.Columns(1).Width = 200
		.Columns(2).Width = 200
		.Columns(3).Width = 200
		.rows(1).Height = 20
		.Style = "Сетка таблицы"
		.Cell(1,1).Range.Text = "№ п/п"
		.Cell(1,1).VerticalAlignment = wdCellAlignVerticalCenter 
		.Cell(1,2).Range.Text = "Количество"
		.Cell(1,2).VerticalAlignment = wdCellAlignVerticalCenter
		.Cell(1,3).Range.Text = "Сумма"
		.Cell(1,3).VerticalAlignment = wdCellAlignVerticalCenter 
	ENDWITH 

           *Вот он переход!!!
           WITH loWord.Selection 
	           .MoveDown(wdLine,1)
           ENDWITH
11 июл 12, 18:09    [12852448]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,
автор
WITH loWord.Selection
.MoveDown(wdLine,1)
ENDWITH
loWord.MoveDown(wdLine,1)
Можно и так. Good luck!
11 июл 12, 19:20    [12852824]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Jonny540,

Пол дела сделали)))
Вот такой еще вопрос , когда в Word вставляешь таблицу и если она очень большая та она разбивается на два листа. И получается что строка попадает в разрыв страниц, и часть содержимого абзаца на одном листе а другая часть на втором.
А как сделать чтобы, если не влезает на лист, то та часть что не влезает переносилась на новый лист целиком? И плюс, с начала шапка о потом продолжение таблицы!
12 июл 12, 17:22    [12858515]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,

Проблема вечная...
Считай строки. Не знаю, может в ворде есть что-нибудь типа _PLENGTH, _PLINENO?
На форуме такая проблема с отчетами FoxPro обсуждалась, поищи, может, поможет.
И на FoxClub что-то я видел на эту тему...
А если после вывода руками допилить документ?
12 июл 12, 19:55    [12859304]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Jonny540,

Нет!, проблема не вечная, вот ответ:
В word есть встроенные функции:
- Разрешить перенос строк на следующую страницу
- Повторять как заголовок на каждой странице
(они лежат: свойство таблицы - строка).
Параметр: «Разрешить перенос строк на следующую страницу» - если снять галочку то строки таблиц не будут разрываться на два листа.
Параметр: «Повторять как заголовок на каждой странице» - если поставить галочку то заголовок таблицы будет повторяться на каждом листе.
Код для FoxPro:
*Разрешить перенос строк на следующую страницу
loWord.Selection.Tables(1).Rows.AllowBreakAcrossPages = .F.
*Повторять как заголовок на каждой странице
#DEFINE wdToggle                  9999998
loWord.Selection.Tables(1).Rows(1).HeadingFormat = wdToggle
17 июл 12, 09:47    [12875997]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,

Спасибо! Когда-то пытался найти, но... А как быть с подчеркиванием при переходе
на новую страницу?
17 июл 12, 10:10    [12876116]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
В приведенном коде описано все как построить отчет, который на картинке!

+
* WdParagraphAlignment
#DEFINE wdAlignParagraphLeft 0
#DEFINE wdAlignParagraphCenter 1
#DEFINE wdAlignParagraphRight 2
#DEFINE wdAlignParagraphJustify 3
* WdCellVerticalAlignment
#DEFINE wdCellAlignVerticalTop 0
#DEFINE wdCellAlignVerticalCenter 1
#DEFINE wdCellAlignVerticalBottom 3
* Orientation
#DEFINE wdOrientLandscape 1
#DEFINE cr CHR(13)
* Строка
#DEFINE wdLine 5
#DEFINE wdCell 12
* Линия подчеркивания
#DEFINE wdUnderlineSingle 1
* Повторяющиеся заголовки
#DEFINE wdToggle 9999998
* Разрыв страницы
#DEFINE wdPageBreak 7
*Selection.InsertBreak Type:=wdPageBreak
* WdPageNumberAlignment
#DEFINE wdAlignPageNumberLeft 0
#DEFINE wdAlignPageNumberCenter 1
#DEFINE wdAlignPageNumberRight 2
#DEFINE wdAlignPageNumberInside 3
#DEFINE wdAlignPageNumberOutside 4

SET OLEOBJECT ON
LOCAL lcColZap, nRow, lcPn, lcperz

*-------------- WORD ---------------------------
LOCAL loWord, loWordDoc, loWordTab
loWord = CREATEOBJECT('Word.Application')
loWord.visible = .F.
loWordDoc=loWord.Documents.Add
loWordDoc.PageSetup.Orientation = wdOrientLandscape
loWordDoc.PageSetup.TopMargin = 40
loWordDoc.PageSetup.BottomMargin = 40
loWordDoc.PageSetup.LeftMargin = 40
loWordDoc.PageSetup.RightMargin = 40
*Пред настройки таблицы
loWord.Selection.Font.Size = 12
loWord.Selection.Font.Name = "Times New Roman"
loWord.Selection.Font.Bold = .F.
loWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft && задается до таблицы
*Таблица документа
loWordTab = loWord.ActiveDocument.Tables.Add(loWord.Selection.Range,1,2)
WITH loWord.Selection.Tables(1)
.Columns(1).Width = 560
.Columns(2).Width = 225
.rows(1).Height = 40
* .Style = "Сетка таблицы"
.Cell(1,1).Range.Text = "СОГЛАСОВАНО"
.Cell(1,1).VerticalAlignment = wdCellAlignVerticalCenter && внутри таблицы
.Cell(1,2).Range.Text = "УТВЕРЖДАЮ"
.Cell(1,2).VerticalAlignment = wdCellAlignVerticalCenter
ENDWITH
WITH loWord.Selection
.MoveDown(wdLine,1)
ENDWITH
*Текст документа
WITH loWord.Selection
.Font.Size =12
.Font.Name = "Times New Roman"
.ParagraphFormat.Alignment = wdAlignParagraphCenter
.TypeText("ПРОТОКОЛ №")
.TypeText(+CHR(10)+CHR(13))
.ParagraphFormat.Alignment = wdAlignParagraphLeft
.TypeText("Присутствовали:")
.TypeText(+CHR(13))
.Font.Underline = wdUnderlineSingle
.TypeText("Рассмотрены вопросы и решения:")
* .Font.Underline = .T.
.TypeText(+CHR(13))
.Font.Underline = .F.
.TypeText("Таблица №")
.TypeParagraph
ENDWITH

loWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
SELECT DocName, DocDate, DocTitle, RegNumb, PointNumb, PointSod, D_n, Naimp ;
FROM Otpz INTO CURSOR OtpzWord ORDER BY Otpz.RegNumb
SELECT COUNT(OtpzWord.RegNumb) as colzap FROM OtpzWord INTO CURSOR OtpzWordCol
lcColZap = OtpzWordCol.colzap
*Пред настройки таблицы
loWord.Selection.Font.Size = 12
loWord.Selection.Font.Name = "Times New Roman"
loWord.Selection.Font.Bold = .F.
* loWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft && задается до таблицы

*Таблица документа
loWordTab = loWord.ActiveDocument.Tables.Add(loWord.Selection.Range,lcColZap+1,4)

SELECT OtpzWord
lcperz = 1
nRow = 0
SCAN
lcPn = RECNO()
nRow = nRow + 1
IF lcperz = 1
WITH loWord.Selection.Tables(1)
.Columns(1).Width = 51
.Columns(2).Width = 245
.Columns(3).Width = 245
.Columns(4).Width = 245
* .rows(1).Height = 20
.Style = "Сетка таблицы" && рисует границы таблицы
.Cell(1,1).Range.Text = "№ п/п"
.Cell(1,1).VerticalAlignment = wdCellAlignVerticalCenter && внутри таблицы
.Rows(1).AllowBreakAcrossPages = .F.
.Cell(1,2).Range.Text = "Документ, по которому имеется невыполнение"
.Cell(1,2).VerticalAlignment = wdCellAlignVerticalCenter
.Rows(1).AllowBreakAcrossPages = .F.
.Cell(1,3).Range.Text = "Пункты и его содержание, ответственный и исполнитель, срок исполнения"
.Cell(1,3).VerticalAlignment = wdCellAlignVerticalCenter
.Rows(1).AllowBreakAcrossPages = .F.
.Cell(1,4).Range.Text = "Принятое решение (или № с/з на перенос)"
.Cell(1,4).VerticalAlignment = wdCellAlignVerticalCenter
.Rows(1).AllowBreakAcrossPages = .F.
* .Rows(1).HeadingFormat = wdToggle && здесь эта функц. не работает
ENDWITH
nRow = nRow + 1
lcperz = 0
ENDIF
WITH loWord.Selection.Tables(1)
.Columns(1).Width = 51
.Columns(2).Width = 245
.Columns(3).Width = 245
.Columns(4).Width = 245
.Style = "Сетка таблицы"
.Cell(nRow,1).Range.Text = lcPn
.Cell(nRow,1).VerticalAlignment = wdCellAlignVerticalTop
.Cell(nRow,2).Range.Text = ALLTRIM(OtpzWord.DocName)+' от '+LEFT(TTOC(OtpzWord.DocDate),8)+' '+ALLTRIM(OtpzWord.DocTitle)+' ('+ALLTRIM(OtpzWord.RegNumb)+')'
.Cell(nRow,2).VerticalAlignment = wdCellAlignVerticalTop
.Cell(nRow,3).Range.Text = 'п. '+ALLTRIM(OtpzWord.PointNumb)+' - '+ALLTRIM(OtpzWord.PointSod)+' Отв.: '+ALLTRIM(OtpzWord.Naimp)+' Срок: '+LEFT(TTOC(OtpzWord.D_n),8)
.Cell(nRow,3).VerticalAlignment = wdCellAlignVerticalTop
.Cell(nRow,4).Range.Text = " "
.Cell(nRow,4).VerticalAlignment = wdCellAlignVerticalTop
.Rows.AllowBreakAcrossPages = .F.
.Rows(1).HeadingFormat = wdToggle
ENDWITH
ENDSCAN
loWord.Selection.Sections(1).Footers(1).PageNumbers.Add(wdAlignPageNumberRight, .T.) && нумерация страниц
loWord.visible = .T.


К сообщению приложен файл. Размер - 54Kb
17 июл 12, 10:27    [12876207]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
Aleks_Aleks,
почему обязательно отчетом, а не програмное формирование ДОС(в формате НТМ)
для печати вордом
SET ALTE TO c:\MK1.DOC
       SET ALTE ON
       TEXT
       <HTML>
       <meta http-equiv=Content-Type content="text/html; charset=CP866">
       <BODY>
       ENDTEXT
       USE KLIENT
       ?'<TABLE BORDER=1 WIDTH=100% CELLSPACING=0 CELLPADDIND=0>'
       ?'<THEAD>'
       ?'<TR>'
       ?'<TH>ПЛАТЕЛЬЩИК'
       ?'<TH>АДРЕС'
       ?'<TH>АДРЕС'
       ?'<TH>АДРЕС'
       
       ?'<TH>КОЛИЧЕСТВО'
       ?'</THEAD>'
       
       DO WHILE .NOT.EOF()
        J=0
        
        DO WHILE J<7    &&ЦИКЛ ДЛЯ КОЛИЧЕСТВА
        J=J+1
        ?'<TR>'
        ?'<TD>',NKLIENT
        ?'<TD>',ADR1,ADR2
        ?'<TD>',ADR1,ADR2
        ?'<TD>',ADR1,ADR2
       
        ?'<TD ALIGN=RIGHT>',SUBS(INN2,4,1)
        LOOP
       SKIP
       ENDDO
       ?'</TABLE>'
       ?'<P>','-'+CHR(12)
       ?'<TABLE BORDER=1 WIDTH=100% CELLSPACING=0 CELLPADDIND=0>'
       
       GO TOP
       DO WHILE .NOT.EOF()
       J2=VAL(SUBS(INN2,4,1))+1
       J1=0
       *WAIT
       DO WHILE J1<J2
       J1=J1+1
       IF J1>0
       ?'<TR HEIGHT=450>'
       ?'<TD><FONT SIZE=5>',TRIM(NKLIENT)
       ?'<BR><FONT SIZE=3>',REPL('-',30)
       ?'<BR><FONT SIZE=7>КУДА:',TRIM(ADR1)
       ?'<BR><FONT SIZE=5>____:',TRIM(ADR2)
       
       *WAIT
       ENDIF
       ENDDO
       SKIP
       ENDDO
       ?'</TABLE>'
       SET ALTE OFF
       SET ALTE TO
       QUIT


К сообщению приложен файл (KLIENT.ZIP - 879bytes) cкачать
17 июл 12, 12:46    [12877232]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
ПЕНСИОНЕРКА
Aleks_Aleks,
почему обязательно отчетом, а не програмное формирование ДОС(в формате НТМ)
для печати вордом

отчетом - Это документ word!

програмное формирование - loWord = CREATEOBJECT('Word.Application') && Какое это формирование если не програмное!?

для печати - Не только для печати, а для: редактирования, сохранения, передачи и т.д.!

НТМ - Есть {FoxPro--Word} здесь нет места HTM!

Не знаю что ты имел в виду, но HTM я знаю плохо, да и зачем эти трудности, по-моему и так все хорошо.
17 июл 12, 13:52    [12877664]     Ответить | Цитировать Сообщить модератору
 Re: Работа с таблицами в Word  [new]
Jonny540
Member

Откуда:
Сообщений: 727
Aleks_Aleks,
спасибо! надо было мне прошерстить файл заголовка :)
высылаю, может, пригодится: вместо большинства #DEFINE один #INCLUDE

К сообщению приложен файл (word.h - 90Kb) cкачать
17 июл 12, 15:14    [12878260]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить