我在Word文档中操作表格时遇到这样一个问题:
当把Word文档置为可视时,在表格中的用MoveDown移动位置时,能正确执行。
如果把Word文档置为不可视时,则在表格中用MoveDown移动位置时,没有反应。
而用MoveLeft、 MoveRight等移动时没有任何问题!
代码如下:
MsAppl.visible := false;
for i := 0 to FTiltles.Count -1 do
begin
TempSerialNum := StrToInt(FSerialNum.Strings[i]);
MsTable.Cell(1,TempSerialNum).Range.Text := FTiltles.Strings[i]
//合并第一、二列
MsAppl.Selection.MoveDown(wdline, 1, wdExtend);
MsAppl.Selection.Cells.Merge; //合并
end; 这段语句:MsAppl.Selection.MoveDown(wdline, 1, wdExtend);没有发生作用。
不知各位兄弟有何高见! 见者有分!!!!!!!
当把Word文档置为可视时,在表格中的用MoveDown移动位置时,能正确执行。
如果把Word文档置为不可视时,则在表格中用MoveDown移动位置时,没有反应。
而用MoveLeft、 MoveRight等移动时没有任何问题!
代码如下:
MsAppl.visible := false;
for i := 0 to FTiltles.Count -1 do
begin
TempSerialNum := StrToInt(FSerialNum.Strings[i]);
MsTable.Cell(1,TempSerialNum).Range.Text := FTiltles.Strings[i]
//合并第一、二列
MsAppl.Selection.MoveDown(wdline, 1, wdExtend);
MsAppl.Selection.Cells.Merge; //合并
end; 这段语句:MsAppl.Selection.MoveDown(wdline, 1, wdExtend);没有发生作用。
不知各位兄弟有何高见! 见者有分!!!!!!!
但visible=false时,就不行。这是什么问题?
建议去看看word2000.pas中此部分的源码,看是否真的是焦点的问题
在word 2000上就有问题,不知是什么情况导致的!
现在想学习怎么来操作word ,谢谢各位 请多指教!~~~
WordDoc: TWordDocument;
myCol:Column;
iStart,iEnd:integer;
(1) 创建并打开Word文件 ==>WordApp ,WordDoc
(2) WordDoc.ConnectTo(WordApp.Documents.Item(1)); iStart:=WordDoc.Tables.Item(i).Cell(1,1).Range.Start;
myCol:= WordDoc.Tables.Item(i).Columns.Item(2);
iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
//合并第一、二列
myRange:=WordDoc.Range;
myRange.Start:=iStart;
myRange.End_ :=iEnd;
myRange.Cells.Merge;(3) 释放 WordApp ,WordDoc
myCol:= WordDoc.Tables.Item(1).Columns.Item(2); //第 1 个表 第 2 列
iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
//合并第一、二列
myRange:=WordDoc.Range;
myRange.Start:=iStart;
myRange.End_ :=iEnd;
myRange.Cells.Merge;
MsAppl.Selection.Cells.Merge; //合并2、错误提示:project PrjCheckManage raised EOleException with message'此命令无效'.
process stopped. use step or run to continue.3、此段代码只有在word2000中出错,而在word xp中完全正常。如果在word2000中
MsAppl.visible := true;则不错,MsAppl.visible := false出错。欢迎各位兄弟指教!!1!1
uses word97;procedure MergerCells;
var WordApp: TWordApplication;
WordDoc: TWordDocument;
myCol:Column;
iStart,iEnd:integer;
DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat: OleVariant;
myRange:Range;
begin if not Assigned(WordApp) then // ===== 创建对象 =====
begin
WordApp:= TWordApplication.Create(nil);
WordApp.Visible := false;
end;
if not Assigned(WordDoc) then
WordDoc:= TWordDocument.Create(nil);
try
DocInx:=1;
oFileName := 'd:\test1.doc';
oReadOnly:=false;
CfCversions := EmptyParam;
AddToRctFiles:= EmptyParam;
PswDocument:= EmptyParam;
PswTemplate:= EmptyParam;
oRevert:= EmptyParam;
WPswDocument:= EmptyParam;
WPswTemplate:= EmptyParam;
oFormat:= EmptyParam; // ===== 打开文件 =====
WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat); WordDoc.ConnectTo(WordApp.Documents.Item(DocInx)); // ===== 关联文件 =====
iStart:=WordDoc.Tables.Item(1).Cell(1,1).Range.Start; //第1个表Cell[1,1]
myCol:= WordDoc.Tables.Item(1).Columns.Item(2); //第1个表第二列
iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
//合并第一、二列
myRange:=WordDoc.Range;
myRange.Start:=iStart;
myRange.End_ :=iEnd;
myRange.Cells.Merge; WordDoc.SaveAs; finally
if Assigned(WordDoc) then // ===== 关闭文件 =====
begin
WordDoc.Close;
WordDoc.Disconnect;
WordDoc.Destroy;
WordDoc := nil;
end;
if Assigned(WordApp) then // ===== 关闭Word =====
begin
WordApp.Quit;
WordApp.Disconnect;
WordApp.Destroy;
WordApp := nil;
end;
end;end;
上面我测试过,没错误给分 ^_^
|------|-------|----------------------------|-----------------|
| | | 测定结果 | 规范要求 |
|项目 |单位 |------|------|-------|------|-----------------|
| | | A | B | C | D | |
|------|-------|------|------|-------|------|-----------------|
| | | | | | | |
|------|-------|------|------|-------|------|-----------------|
| | | | | | | |
|------|-------|------|------|-------|------|-----------------|5、问题出现在合并“项目”栏时不行。十分感谢LuckyJan(小虾无招)兄弟,我也试了一下你的方法。是可行的。呆会散分。
function TLabel.CreateTwoHeadTable(IsVisible: Boolean): Boolean;
var
i, cols, iCount, TempMovePos, k: Integer;
TempColWidth: Double;
TempSerialNum, TempAlign: Integer;
MsVersion: String;
begin
//----------------------1、新建一个word文档--------------------------------------
try
MsAppl := CreateOleObject('Word.Application');
MsVersion := MsAppl.Version;
//MsAppl.visible := IsVisible;
//新建一个Word文档
MsAppl.Documents.add;
//MsAppl.WindowState[wdWindowStateMinimize]; //最小化WORD文档
except
Result := false;
MsAppl.quit;
Abort;
end; //如果不是word2000或word XP,则给予提示并退出操作。
if (MsVersion <> '10.0') and (MsVersion <> '9.0') then
begin
ShowMessage('Word的版本不是最新版本, 请安装Word2000或Word XP!');
Result := false;
MsAppl.quit;
exit;
end; //因为word2000如果为显示状态,操作存在问题.
if MsVersion = '9.0' then
MsAppl.visible := true
else
MsAppl.visible := IsVisible; //------------------2、新建一个表格------------------------------------------
cols := 0;
iCount := 0; //用来记录往第一行插入多少标题
Cols := FColumens.Count;
MsAppl.ActiveDocument.Tables.Add(MsAppl.ActiveDocument.Range(0,0),3,Cols);
MsTable := MsAppl.ActiveDocument.Tables.Item(1); //-----------------3、去除掉表的竖线-----------------------------------------
MsTable.Select; //选中全表
//把表格的竖线及中间的横线去掉;
MsTable.Borders.item(wdBorderLeft).LineStyle := wdLineStyleNone;
MsTable.Borders.Item(wdBorderRight).LineStyle := wdLineStyleNone;
//设置表格顶上线
MsTable.Borders.Item(wdBorderTop).LineStyle := wdLineStyleSingle;
MsTable.Borders.item(wdBorderTop).LineWidth := wdLineWidth050pt;
MsTable.Borders.item(wdBorderTop).Color := wdColorAutomatic;
//设表格底线
MsTable.Borders.item(wdBorderBottom).LineStyle := wdLineStyleSingle;
MsTable.Borders.item(wdBorderBottom).LineWidth := wdLineWidth050pt;
MsTable.Borders.item(wdBorderBottom).Color := wdColorAutomatic;
//设中间横线
MsTable.Borders.item(wdBorderHorizontal).LineStyle := wdLineStyleSingle;
MsTable.Borders.item(wdBorderHorizontal).LineWidth := wdLineWidth050pt;
MsTable.Borders.item(wdBorderHorizontal).Color := wdColorAutomatic;
//设表两侧线
MsTable.Borders.item(wdBorderVertical).LineStyle := wdLineStyleNone;
MsTable.Borders.item(wdBorderDiagonalDown).LineStyle := wdLineStyleNone;
MsTable.Borders.item(wdBorderDiagonalUp).LineStyle := wdLineStyleNone;
MsTable.Borders.Shadow := False;
//设线的属性
MsAppl.Options.DefaultBorderLineStyle := wdLineStyleSingle;
MsAppl.Options.DefaultBorderLineWidth := wdLineWidth050pt;
MsAppl.Options.DefaultBorderColor := wdColorAutomatic;
//标题中间对齐
MsAppl.Selection.MoveUp(wdLine, 1); //定位第一行第一列
MsAppl.Selection.MoveDown(wdLine, 1, wdExtend); //移到第二行第一列
MsAppl.Selection.MoveRight(wdCharacter, cols, wdExtend); //选中第一、二行
MsAppl.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter; //设第一行为中间对齐;
MsAppl.Selection.Cells.VerticalAlignment := wdCellAlignVerticalCenter; //行居中
MsAppl.Selection.MoveLeft(wdCharacter, 1); //回到第一行第一列 //------------------4、合并检验结果列并插入标题-------------------------------
//合并检验结果列
MsAppl.Selection.MoveRight(wdCharacter, FStart - 1); //移到要合并的起始位置
MsAppl.Selection.MoveRight(wdCharacter, FEnd-FStart + 1, wdExtend); //选中要合并的列
MsAppl.Selection.Cells.Merge; //合并
MsAppl.Selection.Range.Text := FCheckTitle; //合并检验结果行
MsAppl.Selection.MoveLeft(wdCharacter, FStart - 1); //移回第一行第一列
//------------------5、插入列标题及合并列-------------------------------------
for i := 0 to FTiltles.Count -1 do
begin
TempSerialNum := StrToInt(FSerialNum.Strings[i]);
//-----------如果TempSerialNum在FStart至FEnd之间,则标题放入第二行----------
if (TempSerialNum >= FStart) and (TempSerialNum <= FEnd) then
begin
if FTiltles.Strings[i] = '该列标题为空' then
begin
if MsVersion = '10.0' then //如果是wordXP
MsTable.Cell(2, TempSerialNum).Range.Text := ''
else if MsVersion = '9.0' then //如果是word2000
MsTable.Cell(2, TempSerialNum - iCount).Range.Text := '';
end
else begin
if MsVersion = '10.0' then //如果是wordXP
MsTable.Cell(2, TempSerialNum).Range.Text := FTiltles.Strings[i]
else if MsVersion = '9.0' then //如果是word2000
MsTable.Cell(2, TempSerialNum - iCount).Range.Text := FTiltles.Strings[i];
end
end //-------------------否则标题插入第一行,并合并第一、二行-------------------
else begin
iCount := iCount + 1; //每插入一次记数器加1
if TempSerialNum > FEnd then
begin
if FTiltles.Strings[i] = '该列标题为空' then
MsTable.Cell(1,TempSerialNum-(FEnd-FStart)).Range.Text := '' //检验结果行合并后被认为为1行
else
MsTable.Cell(1,TempSerialNum-(FEnd-FStart)).Range.Text := FTiltles.Strings[i];//检验结果行合并后被认为为1行
end
else begin
if FTiltles.Strings[i] = '该列标题为空' then
MsTable.Cell(1,TempSerialNum).Range.Text := ''
else
MsTable.Cell(1,TempSerialNum).Range.Text := FTiltles.Strings[i];
end;
//合并第一、二列
MsAppl.Selection.MoveRight(wdCell); //全选二行,因为可能会出现一个单元有多行字符,所以采用下列代码
MsAppl.Selection.MoveLeft(wdCell);
MsAppl.Selection.MoveDown(wdline, 1, wdExtend);
MsAppl.Selection.Cells.Merge; //合并
end;
end;
//-----------------------------设表的宽及对齐方式-----------------------------
MsAppl.Selection.MoveDown(wdLine, 1); //移到第二行
MsAppl.Selection.MoveLeft(wdCharacter, TempSerialNum - 1); //移到第三行第一列
for i := 0 to FTiltles.Count -1 do
begin
//-------------------初始化数据----------------------------
TempColWidth := 0;
TempSerialNum := 0;
TempAlign := 0;
TempMovePos := 0;
if FAlign.Strings[i] = '+' then //左对齐
TempAlign := 3
else if FAlign.Strings[i] = '-' then //右对齐
TempAlign := 2
else if FAlign.Strings[i] = '|' then //中间对齐
TempAlign := 1;
TempColWidth := StrToFloat(FWidths.Strings[i]); //取出标题要插入的列
TempSerialNum := StrToInt(FSerialNum.Strings[i]);
//设置宽度及对齐方式
if i = 0 then
begin
MsAppl.Selection.ParagraphFormat.Alignment := TempAlign;
MsAppl.Selection.Columns.PreferredWidth := 28.3*TempColWidth;
end
else begin
TempMovePos := StrToInt(FSerialNum.Strings[i-1]); //磅与厘米之间的转换,设置列的宽度
MsAppl.Selection.MoveRight(12, TempSerialNum-TempMovePos, 1);
MsAppl.Selection.ParagraphFormat.Alignment := TempAlign;
MsAppl.Selection.Columns.PreferredWidth := 28.3*TempColWidth;
end;
end;
Result := true;
end;