Delphi控制Word,表格?高手请进!(100分)

  • 主题发起人 主题发起人 shuiwen
  • 开始时间 开始时间
S

shuiwen

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中控制生成简单规则象DBGRID那样的表格,可使用wordDoc.tables.add(行数,列数)
但是现在我根据数据生成下列系列格式的复杂表格,怎么控制?象表的Cell(x,y)不知道怎么控制?
DFW不支持表格,我简单画了一个类似的,在上边加上相应的表格即可。
姓名 张三 性别 男
出生年月 1999-1-2
家庭住址 XX省XXX地区
备注
姓名 赵五 性别 男
出生年月 1999-1-2
家庭住址 XX省XXX地区
备注
姓名 李四 性别 男
出生年月 1999-1-2
家庭住址 XX省XXX地区
备注
.................................
 
发给你几个例子,以供参考[Delphi 5+office97] :
procedure TFormExecQuery3.ToWord();
var
Bookmark: TBookmark;
RangeW: Word2000.Range;
v1: Variant;
ov1: OleVariant;
Row1: Word2000.Row;
Template,NewTemplate,ItemIndex:OleVariant;
row,col:integer;
procedure Senddata();
var
I:integer;
tempstr:string;
begin
RangeW:=WordDocument1.Range;
With Query1 do
begin
// disable the UI
DisableControls;
Try
// 加入字段标题
tempstr:='';
for I := 0 to Fields.Count - 2do
tempstr:= tempstr+Fields .DisplayLabel+#9;
tempstr:= tempstr+Fields .DisplayLabel;
WordDocument1.Range.InsertParagraphAfter;
RangeW:=WordDocument1.Paragraphs.Last.Range;
RangeW.Text := tempstr;
// RangeE := RangeE.Next;
First;
row:=RangeW.End_ +1;
col:=Fields.Count ;
while not EOFdo
begin
// 加入字段数据
WordDocument1.Range.InsertParagraphAfter;
RangeW:=WordDocument1.Paragraphs.Last.Range;
tempstr:='';
for I := 0 to Fields.Count - 2do
tempstr:= tempstr+Fields .AsString+#9 ;
tempstr:= tempstr+Fields .AsString;
RangeW.Text := tempstr;
inc(row) ;
Next;
end;

finally
// re-enable the controls
EnableControls;
end;
end;
end;

begin
try
Template := EmptyParam;
NewTemplate := True;
ItemIndex := 1;
try
Wordapplication1.Connect;
//打开Word应用程序
except
MessageDlg('Word 97 没有安装', mtError, [mbOk], 0);
Abort;
end;
Wordapplication1.Visible := True;
//使Word应用程序可见
WordApplication1.Caption := 'OLE自动化范例';
//Create newdo
cument
Template := EmptyParam;
NewTemplate := False;
// WordApplication1.Documents.Add(Template, NewTemplate);
//指定一个Word文档
WordDocument1.Activate;
WordDocument1.ConnectTo (WordApplication1.Documents.Item(ItemIndex) );
// 插入报表标题
WordDocument1.Range.Text := '报表' ;
WordDocument1.Range.Font.Size := 14;
//发送数据到WordDocument1
Senddata();
//把数据转化为表格形式
RangeW := WordDocument1.Content;
v1 := RangeW;
row:=row-1;
v1.ConvertToTable (#9, row, col);
//设置标题格式:实体18号字居中
Row1 := WordDocument1.Tables.Item(1).Rows.Get_First;
//Row1:=Row1.Next ;
Row1.Range.Bold := 1;
Row1.Range.Font.Size := 18;
Row1.Range.ParagraphFormat.Alignment :=wdAlignParagraphCenter;
Row1.Range.InsertParagraphAfter;
ov1 := ' ';
//取消标题表格
Row1.ConvertToText (ov1);
Finally
//关闭Word应用程序Wordapplication1
Wordapplication1.Disconnect ;
end;

end;

 
多谢yun.li,朋友,回去好好研究研究,有不明白的地方还望指教!
 
yun.li朋友:Range.ConvertToTable(row,col,#9)是根据换行把表格平均分开成,row,col的
表格,能否控制每个表格自己的宽度呢?还有,差分单元格,如果把,5个格分成两个,能这样
做么,留下你的邮件,我给你发的例子,根你交流一下,OK?
 
自己在word中录制一个宏看看不就明白了,自己动手丰衣足食!
 
在DELPHI 文 本 和 图 形 的 打 印

对 于 每 一 个WINDOWS 应 用 程 序 开 发 者 来 说, 打 印 功 能 的 实 现 都 是 极 为 棘 手 的, 因 为 要 涉 及 到 相 当 多 的 代 码 而 且 常 常 是 相 当 的 复 杂, 但 是 在DELPHI 中 实 现 文 本 和 图 象 的 打 印 功 能 却 是 非 常 容 易 的。

1、 文 本 的 打 印 功 能。DELPHI 中 文 本 的 打 印 功 能 就 如 同 在DOS 中 实 现 文 本 的 打 印 功 能 一 样 容 易, 需 要 做 的 一 切 只 是 取 得 打 印 参 数, 打 开 打 印 机, 然 后 发 送 文 本 的 每 一 行 内 容。 在DELPHI 中 提 供 了 一 个PRINTERS 程 序 单 元, 它 说 明 了 一 个TPRINTER 对 象, 封 装 了WINDOWS 打 印 工 作 和 输 出 打 印 机 之 间 的 接 口, 并 提 供 常 用 的 属 性 和 方 法, 其 中 画 布CANVAS 是 一 个 非 常 有 用 的 属 性, 它 代 表 了 当 前 打 印 文 件 的 表 面, 是 以 图 形 方 式 来 工 作 的, 整 个 的 打 印 输 出 工 作 仅 仅 是 将 你 打 印 的 内 容 输 出 到TPRINTER 的 属 性CANVAS 上, 当 全 部 的 输 出 工 作 完 成 以 后, 打 印 对 象(TPRINTER) 把CANVAS 的 属 性 值 送 到 打 印 机 上 去。

下 面 举 例 来 说 明 如 何 通 过DELPHI 实 现 文 本 内 容 的 打 印。 在DELPHI 中 提 供 了PRINTDIALOG、PRINTERSETUPDIALOG 两 个 控 件 允 许 我 们 进 行 打 印 机 以 及 其 他 影 响 打 印 输 出 的 选 择, 此 外 最 重 要 的 一 点 是 要 想 实 现 打 印 功 能 必 须 在 编 译 程 序 以 前 将PRINTERS 加 入 到INTERFACE 或 者IMPLEMENTATION 的UESE 语 句 当 中, 因 为PRINTER 单 元 包 括ASSIGNPRN 和 其 他 控 制 打 印 机 的 过 程。

首 先 在FORM 当 中 加 入MEMO、PRINTDIALOG、PRINTERSETUPDIALOG 和 两 个BUTTON 控 件, 两 个 BUTTON 的CAPTION 分 别 为“ 打 印 设 置” 和“ 打 印”。 然 后 编 写BUTTON 的 事 件 驱 动 程 序( 代 码 在 下 面), 这 个 简 单 的 例 子 中 只 要 单 击“ 打 印” 按 钮 时 便 可 以 在 打 印 机 上 输 出 文 件0S2.TXT, 打 印 事 件 的 清 单 如 下:

implementation
uses printers;
{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin

printersetupdialog1.execute;
//选择输出的打印机以及其他打印控制选项
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
lines:integer;
prntext:system.text;
//将PRNTEXT声名为一个在SYSTEM程序单元当中定义的文本文件
begin

if printdialog1.execute then

assignprn(prntext);
//将PRNTEST分配给打印机
rewrite(prntext);
//调用REWRITE函数,为输出打开已分配的文件
printer.canvas.font:=memo1.font;

//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性
for lines:=0 to memo1.lines.count-1do

writeln(prntext
memo1.lines[lines]);
//把MEMO的内容写到打印机对象
system.close(prntext);
//关闭打印文件
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

memo1.lines.loadfromfile('c:/dos/os2.txt');
//在FORM建立时读入C:/DOS/OS2.TXT文件
end;

end.

2、 图 形 的 打 印 功 能
简 单 的 图 形 打 印 功 能 也 如 打 印 文 本 一 样 的 容 易, 只 是 告 诉 打 印 机 对 象(TPRINTER) 开 始 打 印, 把 图 形 简 单 的 复 制 到 打 印 机 上 去, 最 后 告 诉 打 印 机 结 束 打 印 工 作。

举 例 说 明: 将 上 面 的 例 子 的MEMO 控 件 换 成IMAGE 控 件, 再 经 过 一 些 简 单 的 修 改, 图 形 打 印 的 代 码 如 下:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin

if printdialog1.execute then

begin

printer.begin
doc;
printer.canvas.draw(0
0
image1.picture.graphic);
printer.enddoc;
end;

end;

在 这 种 情 况 下, 使 用 的 是 打 印 机 的 分 辨 率, 图 形 在 页 面 的 左 上 角 开 始 打 印 输 出, 打 出 的 图 形 很 小, 在 很 多 的 情 况 下 不 能 符 合 要 求, 但 是 打 印 机 画 布CANVAS 的STRETHDRAW 的 方 法, 可 以 让 我 们 对 图 形 进 行 灵 活 的 处 理, 画 布(CANVAS) 的STRETCHDRAW 方 法 声 名 为:

procedure StretchDraw(const Rect: TRect;
Graphic: TGraphic);
其中的RECT参数代表图形输出区域的大小,TRECT的类型声名为:
TRect = record
case Integer of
0: (Left
Top
Right
Bottom: Integer);
1: (TopLeft
BottomRight: TPoint);
end;

因 此 我 们 只 要 调 整RECT 的 大 小 及 其 在 打 印 页 面 上 的 位 置, 进 而 达 到 自 己 满 意 的 效 果, 下 面 的 代 码 是 不 断 的 放 大 图 形, 充 满 我 们 定 义 的 矩 形 区 域, 并 将 其 定 位 在 打 印 机 画 布(CANVAS) 的 中 央 进 行 输 出。 代 码 如 下:

procedure TForm1.Button1Click(Sender: TObject);
VAR
strect:Trect;
//定义打印输出矩形框的大小
temhi
temwd:integer;
begin

if printdialog1.execute then

begin

temhi:=image1.picture.height;
temwd:=image1.picture.width;
while (temhi printer.pageheight div 2)and
//将图形放大到打印页面的1/2大小
(temwd printer.pagewidth div 2)do

begin

temhi:=temhi+temhi;
temwd:=temwd+temwd;
end;

with strectdo
//定义图形在页面上的中心位置输出
begin

left:=(printer.pagewidth -temwd) div 2;
top:=(printer.pageheight-temhi) div 2;
right:=left+temwd;
bottom:=top+temhi;
end;

with printerdo

begin

begin
doc;
//将放大的图形向打印机输出
canvas.stretchdraw(strect
image1.picture.graphic);
enddoc;
end;

end;

end;

以 上 代 码 在DELPHI5.0 上 编 译 通 过, 通 过 这 些 小 小 的 例 子, 相 信 大 家 对 于 在DELPHI 中 打 印 图 形 和 文 本 有 一 定 的 了 解, 同 样 通 过 打 印 机 的 画 布(CANVAS) 属 性 也 可 以 实 现 数 据 库 表 单 的 打 印, 在 这 里 不 一 一 赘 述, 如 果 大 家 有 兴 趣 不 妨 一 试。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部