首先说一下我为什么会有这种需求:
因为在我的应用中有特殊要求,把一些文档设置成每一页对应数据库中的一条记录(比如说一个文档假如有10页,那它在数据库中就有10条数据,并且不同的页的文档保存在不同记录里面),要访问时才从数据库取出来生成doc临时文件。
我使用以下代码可以往一个doc文档插入一个页码信息(因为我一个doc文档只有一页,所以不用考虑多页的情况):
procedure AddPageFooter(
sFilename: String; //文档路径
iCurrentPage: Integer; //当前页码
iPageCount: Integer //总页数
);
var
m, n: OleVariant;
doc: OleVariant;
WordApp: Variant;
begin
m := wdLine;
n := 1;
WordApp := CreateOleObject('Word.Application');
try
doc := WordApp.Documents.Open(sFilename);
WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter;
WordApp.Selection.Move(m, n);
WordApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight; WordApp.Selection.InsertAfter(Format('第%d页 / 共%d页', [iCurrentPage, iPageCount]));
WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
doc.Save;
finally
try
doc.Close;
WordApp.Quit;
finally
//
end;
end;
end; 以上都调试通过,没有问题。但是后来又提出了新的需求:要导出不连续的若干页内容,目的是先打印其中的一部分内容。我把所选的内容都导出为临时文件之后,用以下方式合并:
WordApp.Documents.Open(SaveDialog1.FileName);
for i := 1 to iSelectedCount do
begin
if (i > 1) then
WordApp.Selection.InsertBreak(wdPageBreak);
WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
end;
WordApp.ActiveDocument.Save; 但是问题出现了:每一页的显示页码的那个位置显示的都是第一页的信息。比如说我第一页是“第1页/共10页”,那后面每一页显示的都是这个字符串。
我又试过这样测试,在word中使用“插入页码”的方式(不是用代码)设置几个doc文档,然后把这些文档用上述方式合并,结果发现,页码是根据第一页的页码,后面的自动递增的,没办法显示不连续的数字页码。 我的问题是:有没有办法改进插入页码的函数或者改进合并文档的方式,使它合并后页码那个位置显示的字符串(不一定是页码)不会因为合并而发生变化?
因为在我的应用中有特殊要求,把一些文档设置成每一页对应数据库中的一条记录(比如说一个文档假如有10页,那它在数据库中就有10条数据,并且不同的页的文档保存在不同记录里面),要访问时才从数据库取出来生成doc临时文件。
我使用以下代码可以往一个doc文档插入一个页码信息(因为我一个doc文档只有一页,所以不用考虑多页的情况):
procedure AddPageFooter(
sFilename: String; //文档路径
iCurrentPage: Integer; //当前页码
iPageCount: Integer //总页数
);
var
m, n: OleVariant;
doc: OleVariant;
WordApp: Variant;
begin
m := wdLine;
n := 1;
WordApp := CreateOleObject('Word.Application');
try
doc := WordApp.Documents.Open(sFilename);
WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter;
WordApp.Selection.Move(m, n);
WordApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight; WordApp.Selection.InsertAfter(Format('第%d页 / 共%d页', [iCurrentPage, iPageCount]));
WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
doc.Save;
finally
try
doc.Close;
WordApp.Quit;
finally
//
end;
end;
end; 以上都调试通过,没有问题。但是后来又提出了新的需求:要导出不连续的若干页内容,目的是先打印其中的一部分内容。我把所选的内容都导出为临时文件之后,用以下方式合并:
WordApp.Documents.Open(SaveDialog1.FileName);
for i := 1 to iSelectedCount do
begin
if (i > 1) then
WordApp.Selection.InsertBreak(wdPageBreak);
WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
end;
WordApp.ActiveDocument.Save; 但是问题出现了:每一页的显示页码的那个位置显示的都是第一页的信息。比如说我第一页是“第1页/共10页”,那后面每一页显示的都是这个字符串。
我又试过这样测试,在word中使用“插入页码”的方式(不是用代码)设置几个doc文档,然后把这些文档用上述方式合并,结果发现,页码是根据第一页的页码,后面的自动递增的,没办法显示不连续的数字页码。 我的问题是:有没有办法改进插入页码的函数或者改进合并文档的方式,使它合并后页码那个位置显示的字符串(不一定是页码)不会因为合并而发生变化?
解决方案 »
- Delphi7,如何编写出能够实时监测机器故障
- 贪心算法解决序列排序
- 关于事件的建立(简单问题)
- 怎么样把那那一个*.dbf格式的数据导入SQL中
- 大家来帮忙,出出主意,共享200M免费空间。
- 怎么得到dbgrid中选中的某一行的某一列的值
- ADO与Midas问题,请高手指教
- ***急!!!急!!!急!!!怎么使一个有关SQL SERVER的应用程序能在98下用?
- 这个问题挺难的!!
- 请问各位前辈,是否只有新增加的字段才有可能成为计算字段?谢谢!
- 请问高手如何在一个应用中取到另一个应用中窗体关闭的消息(另一个应用已封装成Dll包,通过包接口调用创建窗体的函数)
- 新手想大家问一个问题!为啥这条直线画不出来!(在线等!)
sFilename: String; //文档路径
iCurrentPage: Integer; //当前页码
iPageCount: Integer //总页数
);
你每次插入文档的时候,更新这几个参数不就行了吗?
word文档有节的概念,不同的节,可以有不同的起始页码。你不分节,当然达不到不连续页码的要求。
所以,建议插入分节符,然后就能设置不同的起始页码了。
.PageNumbers.StartingNumber = 3
还有,你上次所说的“vba参考资料可以直接看Word的帮助”,恕我愚钝,我找了半天还是没有找到,能说一下具体是哪个章节么?:(to 严黎斌(): 谢谢你提供的思路,我再看看。
BreakType:=wdSectionBreakContinuous; 加节不另起一页
WordA.Selection.InsertBreak(BreakType); //加入一节。
WordDocument1.Sections.Item(J+1).PageSetup. //页面设置。其他可以参考VBA的帮助,安装office的时候带有。大概10M。
begin
if (i > 1) then
WordApp.Selection.InsertBreak(wdSectionBreakContinuous);
//这个地方我原来传的参数值为wdPageBreak,改完之后ok WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
end;
[空白]
第一页
第二页
就是说,wdSectionBreakContinuous参数是把当前页的页脚的内容应用到下一页去了。不得已,重装了Office并安装了相关的帮助(之前Word有问题,打不开帮助。安装时把word相关的帮助全部安装),在帮助目录中“与编程有关的信息”中找到了vba的相关帮助,再次修改代码如下:
for i := 1 to iSelectedCount do
begin
if (i > 1) then
WordApp.Selection.InsertBreak(wdSectionBreakNextPage);
//这个参数的意义应该是另起新页(没有看到关于这些参数的说明) WordApp.Selection.InsertFile(sFilePath + IntToStr(i) + '_.doc');
end;