Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
3-48892
VID
2002-12-20 12:17
2003.01.16
Загрузка данных в датасет из файла... и далее...


6-49175
SergeySA
2002-11-15 14:04
2003.01.16
Как запретить доступ к одному IP или группе IP


14-49235
Snake2000
2002-12-26 15:51
2003.01.16
Люди, помогите решить задачу !!!


14-49214
Marser
2002-12-27 23:42
2003.01.16
В жизни любого человека


4-49360
ed30
2002-11-29 13:30
2003.01.16
Освобождение памяти после работы внешней программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский