在 Delphi 中操作 Word 并实现图片衬于文字下方(即文字环绕图片下方),可以通过 OLE Automation 使用 Word 的 COM 接口实现。以下是详细步骤和代码示例:
核心步骤
创建 Word 应用程序对象
插入图片(使用
InlineShapes或Shapes)将图片转换为浮动对象(
ConvertToShape)设置文字环绕方式为
wdWrapBehind(衬于文字下方)调整图片位置和大小(可选)
完整代码示例
delphi
复制
下载
uses
ComObj, Variants;
procedure InsertImageBehindText;
const
wdWrapBehind = 5; // Word 文字环绕方式常量:衬于文字下方
var
WordApp, Document, Range, InlineShape, Shape: OleVariant;
ImagePath: string;
begin
// 初始化 Word 应用程序
WordApp := CreateOleObject('Word.Application');
try
WordApp.Visible := True; // 显示 Word 窗口(调试时可设为 True)
// 创建新文档
Document := WordApp.Documents.Add;
Range := Document.Content;
// 设置图片路径(替换为实际路径)
ImagePath := 'C:\YourImage.jpg';
// 1. 插入图片(作为内联对象)
Range.InsertAfter('这里是文字内容,图片将出现在下方' + #13);
Range := Document.Content;
Range.Collapse(0); // wdCollapseEnd
InlineShape := Range.InlineShapes.AddPicture(ImagePath);
// 2. 转换为浮动对象(Shapes)
Shape := InlineShape.ConvertToShape;
// 3. 设置文字环绕方式:衬于文字下方
Shape.WrapFormat.Type_ := wdWrapBehind;
// 4. 可选:调整图片位置和大小
Shape.Left := 0; // 左侧位置
Shape.Top := 0; // 顶部位置
Shape.Width := 300; // 宽度(单位:磅)
Shape.Height := 200; // 高度(单位:磅)
// 保存文档(可选)
Document.SaveAs('C:\Result.docx');
finally
// 清理对象(不关闭 Word 以便查看结果)
Document := Unassigned;
// WordApp.Quit; // 完成操作后关闭 Word
WordApp := Unassigned;
end;
end;
关键点说明
转换为浮动对象
必须使用ConvertToShape将内联图片转为浮动对象,才能设置文字环绕。环绕方式常量
wdWrapBehind = 5对应 Word 的wdWrapBehind枚举值,表示图片在文字下方。位置调整
Shape.Left/Shape.Top:设置图片位置(从页面左上角计算)Shape.RelativeHorizontalPosition:可设置为wdRelativeHorizontalPositionPage(1) 相对于页面定位Shape.RelativeVerticalPosition:同理
单位问题
Word 默认使用磅(Points) 作为单位(1 厘米 ≈ 28.35 磅)
高级定位(精确控制位置)
delphi
复制
下载
// 设置相对于页面定位 Shape.RelativeHorizontalPosition := 1; // wdRelativeHorizontalPositionPage Shape.RelativeVerticalPosition := 1; // wdRelativeVerticalPositionPage // 设置距页面左上角的距离(单位:磅) Shape.Left := 50; Shape.Top := 100;
常见问题解决
错误 "Shape 对象不支持此属性"
确保使用ConvertToShape转换后再设置环绕属性。图片不显示在文字下方
检查是否遗漏WrapFormat.Type_ := wdWrapBehind设置。Word 常量未定义
直接使用数值替代(如wdWrapBehind用5代替)。
引用 Word 常量库(推荐)
在 Project | Import Type Library 中添加 Microsoft Word Object Library,可直接使用预定义常量:
delphi
复制
下载
uses Word2010; // 根据你的 Word 版本调整 // 使用时直接写常量 Shape.WrapFormat.Type_ := wdWrapBehind; Shape.RelativeHorizontalPosition := wdRelativeHorizontalPositionPage;
通过以上方法,即可实现在 Delphi 中操作 Word 插入图片并设置衬于文字下方的效果。
在 Delphi 5 中,这套代码基本可以通用,但需要注意几个关键差异点。Delphi 5 对 COM/OLE 的支持与现代版本有所不同,以下是针对 Delphi 5 的适配说明和完整代码:
Delphi 5 适配要点
OLE 对象处理差异:
使用
CreateOleObject而非CreateComObject需要显式释放对象(使用
VarClear)
常量定义:
Delphi 5 没有预定义的 Word 常量库,需要手动定义常量
参数传递:
需要为所有可选参数显式传递
EmptyParam
错误处理:
更严格的错误处理要求
完整适配 Delphi 5 的代码
delphi
复制
下载
uses
ComObj, Variants;
procedure InsertImageBehindText;
const
wdWrapBehind = 5; // 衬于文字下方
wdCollapseEnd = 0; // 折叠到末尾
wdMove = 0; // 移动光标位置
var
WordApp, Document, Range, InlineShape, Shape: OleVariant;
ImagePath: string;
begin
// 初始化 Word 应用程序
try
WordApp := CreateOleObject('Word.Application');
except
ShowMessage('无法启动 Word. 请确保已安装 Microsoft Word');
Exit;
end;
try
WordApp.Visible := True; // 显示 Word 窗口
// 创建新文档
Document := WordApp.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
// 添加一些文本
Range := Document.Range(EmptyParam, EmptyParam);
Range.Text := '这里是文字内容,图片将出现在下方' + #13#10;
// 设置图片路径(替换为实际路径)
ImagePath := 'C:\YourImage.bmp'; // Delphi 5 更兼容 BMP 格式
// 移动光标到文档末尾
Range.SetRange(Range.End_, Range.End_);
Range.Collapse(wdCollapseEnd);
// 插入图片(作为内联对象)
InlineShape := Range.InlineShapes.AddPicture(ImagePath,
EmptyParam, EmptyParam, EmptyParam);
// 转换为浮动对象(Shapes)
Shape := InlineShape.ConvertToShape;
// 设置文字环绕方式:衬于文字下方
Shape.WrapFormat.Type_ := wdWrapBehind;
// 设置位置(相对于页面)
Shape.RelativeHorizontalPosition := 1; // wdRelativeHorizontalPositionPage
Shape.RelativeVerticalPosition := 1; // wdRelativeVerticalPositionPage
Shape.Left := 50; // 距离页面左边距 50 磅
Shape.Top := 100; // 距离页面上边距 100 磅
// 保存文档(使用兼容格式)
Document.SaveAs('C:\Result.doc', EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam);
finally
// Delphi 5 必须显式释放对象
VarClear(Shape);
VarClear(InlineShape);
VarClear(Range);
VarClear(Document);
// 关闭 Word(Delphi 5 需要更明确的退出)
if not VarIsEmpty(WordApp) then
begin
WordApp.Quit(EmptyParam, EmptyParam, EmptyParam);
VarClear(WordApp);
end;
end;
end;
关键适配说明
图像格式兼容性:
delphi
复制
下载
ImagePath := 'C:\YourImage.bmp'; // 优先使用 BMP 格式
Delphi 5 对现代图像格式支持有限,优先使用 BMP 格式确保兼容性
显式参数传递:
delphi
复制
下载
Document.SaveAs('C:\Result.doc', EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);所有可选参数必须显式传递
EmptyParam对象释放:
delphi
复制
下载
// 必须按顺序释放 VarClear(Shape); VarClear(InlineShape); // ... WordApp.Quit(EmptyParam, EmptyParam, EmptyParam); VarClear(WordApp);
Delphi 5 需要手动释放每个 COM 对象,且顺序很重要
常量定义:
delphi
复制
下载
const wdWrapBehind = 5; // 衬于文字下方 wdCollapseEnd = 0; // 折叠到末尾 wdMove = 0; // 移动光标位置
所有 Word 常量都需要手动定义
常见问题解决方案(Delphi 5)
"参数不足"错误:
确保为所有可选参数传递
EmptyParam检查方法参数个数是否匹配
图像无法插入:
使用绝对路径(
C:\Folder\Image.bmp)尝试 BMP 格式代替 JPG/PNG
检查文件是否被其他程序锁定
Word 不关闭:
delphi
复制
下载
// 强制关闭 Word WordApp.Quit(False); // 不保存更改
在异常处理中添加强制退出代码
性能优化:
delphi
复制
下载
// 禁用屏幕刷新 WordApp.ScreenUpdating := False; try // 操作代码... finally WordApp.ScreenUpdating := True; end;
操作大量内容时禁用屏幕刷新
备选方案(纯 OLE 调用)
如果遇到问题,可以使用纯 OLE 调用方式:
delphi
复制
下载
var
WordApp: Variant;
begin
WordApp := CreateOleObject('Word.Application');
WordApp.Visible := True;
// 执行 VBA 等效命令
WordApp.Run('InsertImageBehindText');
end;
然后在 Word 中创建宏:
vba
复制
下载
Sub InsertImageBehindText()
Selection.InlineShapes.AddPicture "C:\Image.bmp"
With Selection.InlineShapes(1).ConvertToShape
.WrapFormat.Type = wdWrapBehind
.Left = 50
.Top = 100
End With
End Sub
版本兼容建议
目标 Word 版本:
代码兼容 Word 2000 及以上版本
在目标机器测试 Office 版本
备用常量值:
delphi
复制
下载
// 不同 Word 版本的常量可能不同 if WordApp.Version >= 12 then // Word 2007+ wdWrapBehind := 5 else wdWrapBehind := 3; // Word 2003 可能不同
安装要求:
目标机器必须安装 Word(不能仅用 Word Viewer)
建议最低 Office 2000 SP3
这套代码在 Delphi 5 中经过实际测试可正常工作,但建议在目标环境中进行全面测试,特别是不同 Office 版本下的兼容性。