Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.16;
Скачать: CL | DM;

Вниз

StringGrid в Word   Найти похожие ветки 

 
AlekseyK ©   (2003-01-03 11:37) [0]

Привет. Подскажите, как данные из StringGrid"а записать в word"овский документ.


 
Ops   (2003-01-03 11:41) [1]

1. Создаешь объект worda.
2. Пишешь в файл
3. Сохраняешь его
4. Закрываешь word

Если без worda шукай спец компоненты...


 
alvin   (2003-01-03 11:47) [2]

tabl:=range.tables.add()
и в цикле присваиваешь значения каждой ячейке
(вот только работает это достаточно медленно)
tabl.Cell(i,j).Width:=50;
tabl.Cell(i,j).Range.Text:=StringGrid1.Cells[0,i];


 
alvin   (2003-01-03 11:50) [3]

tabl:=range.tables.add()
и в цикле присваиваешь значения каждой ячейке
(вот только работает это достаточно медленно)
for i:=0 to StringGrid1.RowCount-1 do begin
// задаем значение ячеек в 4х столбцах
tabl.Cell(i+1,1).Width:=50;//ширина столбца
tabl.Cell(i+1,1).Range.Text:=StringGrid1.Cells[0,i];
tabl.Cell(i+1,2).Width:=150;
tabl.Cell(i+1,2).Range.Text:=StringGrid1.Cells[1,i];
tabl.Cell(i+1,3).Width:=170;
tabl.Cell(i+1,3).Range.Text:=StringGrid1.Cells[2,i];
tabl.Cell(i+1,4).Width:=80;
tabl.Cell(i+1,4).Range.Text:=StringGrid1.Cells[3,i];


 
AlekseyK ©   (2003-01-03 11:55) [4]

А можно подробнее.
например так пишу
if savedg.execute=true then
begin
//создаю объект (как?)
assignfile или еще както просто я не встречался раньше с етим
если можно дайте маленький пример


 
AlekseyK ©   (2003-01-03 11:58) [5]

tabl созданный объект word"a ?


 
Ops   (2003-01-03 12:05) [6]

var
XLApp, WS, CountSheets : OLEVariant;
begin
XLApp := CreateOleObject("Excel.Application");
XLApp.Visible := True; // не показываем Excel
XLApp.Workbooks.Add(xlWBATWorksheet);
дальше точ то тебе сказали доб таблицу пихаем даннык и т.д.

Это идея. Доки под курой нет... Если уловил разберешся


 
Ops   (2003-01-03 12:13) [7]

Нашел примерчик - надеюсь ща ктонибудь кинет тебе код полчучше...
V := CreateOleObject("Word.Application");
V.ShowMe;
V.WordBasic.FileNew;
V.WordBasic.FileSave;


 
alvin   (2003-01-03 15:47) [8]

Если имеется Delphi выше 4 используй word из вкладки Servers. В четвертой Delphi надо использовать word_tlb. Вообще если хочещь - могу выслать готовые юниты с примерами (писать многовато)


 
alvin   (2003-01-03 16:12) [9]

В delphi7 это примерно выглядит так.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, OleServer, Word2000;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Word: TWordApplication;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
w_par:Paragraph;
w_tab:Table;
w_range:Range;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
for i:=0 to StringGrid1.ColCount-1 do
for j:=0 to StringGrid1.RowCount-1 do
StringGrid1.Cells[i,j]:=IntToStr(i+j);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
Word:=TWordApplication.Create(nil);
Word.Visible:=true;
w_par:=Word.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam)
.Paragraphs.Add(EmptyParam);
w_range:=w_par.Range;
w_tab:=w_range.Tables.Add(w_range,StringGrid1.RowCount,StringGrid1.ColCount,EmptyParam,EmptyParam);
for i:=0 to StringGrid1.RowCount-1 do begin

w_tab.Cell(i+1,1).Width:=50;
w_tab.Cell(i+1,1).Range.Text:=StringGrid1.Cells[0,i];
w_tab.Cell(i+1,2).Width:=150;
w_tab.Cell(i+1,2).Range.Text:=StringGrid1.Cells[1,i];
w_tab.Cell(i+1,3).Width:=170;
w_tab.Cell(i+1,3).Range.Text:=StringGrid1.Cells[2,i];
w_tab.Cell(i+1,4).Width:=80;
w_tab.Cell(i+1,4).Range.Text:=StringGrid1.Cells[3,i];
{Word.Disconnect;}
end;
end;

end.


 
AlekseyK ©   (2003-01-03 17:17) [10]

У меня Delphi6
Если не трудно то пришли пример на D6
Спасибо.


 
alvin   (2003-01-03 20:01) [11]

Аналогично и для D6 (в палитре компонент найди на вкладке Servers WordApplication и положи его на форму и в свойстве name напиши Word и можешь напрямую копировать этот код). Кстати предложение о том чтобы выслать на мыло примеры все еще в силе


 
AlekseyK ©   (2003-01-07 16:47) [12]

Все работает но ты прав ОЧЕНЬ МЕДЛЕНО
Что можно сделать для быстроты записи в Word или всетаки просто писать в txt файл


 
alvin   (2003-01-07 21:32) [13]

Можешь запустить обработку таблицы отдельным потоком, тогда по крайней мере форма "жива" будет


 
Alex Konshin   (2003-01-07 22:43) [14]

Можно через clipboard - это НАМНОГО быстрее, но это, естественно, изменяет содержимое clipboard, что, вообще говоря, не хорошо, так как пользователь этого может и не ожидать.
Там только есть хитрость с codepage, для 9x и для NT получается немного разный код. Когда-то давно я кидал этот код в FIDO и с тех пор он гуляет по всяким FAQ. Есть еще другая хитрость: excel может глючить, есть ему попытаться скормить слишком большой кусок, поэтому придется кормить его порциями в цикле.
Если не найдешь в Internet"e, то тогда подожди несколько часов, когда я буду дома и закину его сюда.


 
Alex Konshin   (2003-01-08 06:55) [15]

Вот я и дома...
А вот и обещанный код:

procedure SetClipboardText( const AText : String );
var len, ulen : Integer;
hClip : THandle;
pClip : Pointer;
begin
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin
len := Length(AText)+1;
ulen := len+len;
hClip := GlobalAlloc(GMEM_MOVEABLE,ulen);
if hClip=0 then raise Exception.Create(SysErrorMessage(GetLastError))
else
try
pClip := PWideChar(GlobalLock(hClip));
if pClip=nil then raise Exception.Create(SysErrorMessage(GetLastError))
else
begin
try
MultiByteToWideChar(CODEPAGE,0,PChar(AText),len,pClip,ulen);
finally
GlobalUnlock(hClip);
end;
Clipboard.SetAsHandle(CF_UNICODETEXT,hClip);
end;
except
GlobalFree(hClip);
raise;
end;
end
else
begin
Clipboard.SetTextBuf(PChar(AText));
SetClipboardData(CF_LOCALE,LANG_RUSSIAN);
end;
end;


 
Alex Konshin   (2003-01-08 07:04) [16]

А, еще забыл добавить
const
CODEPAGE = 1251;
Да, естественно, я предполагал, что тест русский или английский.
Сразу отвечу, что системный дефолтный локале использовать не всегда хорошо, так он не всегда правильно установлен.



Страницы: 1 вся ветка

Текущий архив: 2003.01.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
3-48862
satron
2002-12-23 12:56
2003.01.16
Как


1-49082
kolega
2003-01-04 22:49
2003.01.16
как исправить иероглифы?


1-49106
fifo
2003-01-05 10:39
2003.01.16
транспонированный запрос


3-48876
Подскажите
2002-12-19 15:51
2003.01.16
Нужно составить запрос


14-49265
Свой
2002-12-25 11:20
2003.01.16
Какую ОС поставить