procedure TWordReport.OpenWithData(FileName: String; Data: OleVariant; Param: String = '');
var
MyWord: OleVariant;
WordDoc: OleVariant;
iLoop, jLoop: integer;
DocText, ReplaceText: WideString;
EndText: TStringList;
MyTable: Variant;
MyRange: Variant;
iCol, iRow: integer;
sParam, sValue: TStringList;
sSQL: String;
begin
FromData.Data := Data;
EndText := TStringList.Create;
m_Param := Param;
{ 分解自定义参数和值 }
sParam := Split(GetStr(Param, ';', 0));
sValue := Split(GetStr(Param, ';', 1), #15);
{ 新建一个 WORD 文档 }
MyWord := GetOrCreateObject('Word.Application');
WordDoc := MyWord.Documents.Add(FileName, NewTemplate:=False);
//MyWord.Visible := true;
try
{ 替换参数 }
if sParam.Count = sValue.Count then
for iLoop := 0 to sParam.Count - 1 do
begin
MyWord.Selection.Find.Text := '$' + sParam.Strings[iLoop];
MyWord.Selection.Find.Replacement.Text := sValue.Strings[iLoop];
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
end;
{ 替换一些宏 }
MyWord.Selection.Find.Text := '$Now';
MyWord.Selection.Find.Replacement.Text := DateTimeToStr(Now);
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '$Date';
MyWord.Selection.Find.Replacement.Text := DateToStr(Date);
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '$Time';
MyWord.Selection.Find.Replacement.Text := TimeToStr(Time);
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '$UserDate';
MyWord.Selection.Find.Replacement.Text := Static.Date;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '$Company';
MyWord.Selection.Find.Replacement.Text := CurUser.Company;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[usercode]';
MyWord.Selection.Find.Replacement.Text := CurUser.usercode;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[username]';
MyWord.Selection.Find.Replacement.Text := CurUser.UserName;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[deptno]';
MyWord.Selection.Find.Replacement.Text := CurUser.deptno;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[datapopedom]';
MyWord.Selection.Find.Replacement.Text := CurUser.datapopedom;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[科目表名]';
MyWord.Selection.Find.Replacement.Text := '财务_科目' + SysCode.CurFinYear;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[curfinyear]';
MyWord.Selection.Find.Replacement.Text := SysCode.CurFinYear;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
MyWord.Selection.Find.Text := '[curfinmonth]';
MyWord.Selection.Find.Replacement.Text := SysCode.CurFinMonth;
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
{ 先分析以 <- 和 -> 括起来的文字 }
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[<]-*-[>]', MatchWildcards := true);
while MyWord.Selection.Find.Found do
begin
DocText := MyWord.Selection.Text;
DocText := Copy(DocText, 3, Length(DocText) - 4);
EndText.Clear;
MacroToData(DocText, EndText);
ReplaceText := '';
for jLoop := 0 to EndText.Count - 1 do
ReplaceText := ReplaceText + EndText.Strings[jLoop] + #15; // 用 #15 先代替回车
if ReplaceText <> '' then
ReplaceText := Copy(ReplaceText, 0, Length(ReplaceText) - 1); // 把最后一个 #15 去掉
MyWord.Selection.Text := ReplaceText;
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[<]-*-[>]', MatchWildcards := true);
end;
MyWord.Selection.Find.Text := #15;
MyWord.Selection.Find.Replacement.Text := '^p';
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, Forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
{ 先分析以 大括号 括起来的文字 }
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[{]*[}]', MatchWildcards := true);
while MyWord.Selection.Find.Found do
begin
DocText := MyWord.Selection.Text;
DocText := Copy(DocText, 2, Length(DocText) - 2);
EndText.Clear;
MacroToData(DocText, EndText);
ReplaceText := '';
for jLoop := 0 to EndText.Count - 1 do
ReplaceText := ReplaceText + EndText.Strings[jLoop] + #15; // 用 #15 先代替回车
if ReplaceText <> '' then
ReplaceText := Copy(ReplaceText, 0, Length(ReplaceText) - 1); // 把最后一个 #15 去掉
MyWord.Selection.Text := ReplaceText;
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[{]*[}]', MatchWildcards := true);
end;
MyWord.Selection.Find.Text := #15;
MyWord.Selection.Find.Replacement.Text := '^p';
MyWord.Selection.Find.Execute(Replace:=wdReplaceAll, Forward:= True, Wrap := wdFindContinue, MatchWildcards := false);
{**
* 处理用 [SQLNOTITLE] 和 [/SQLNOTITLE] 括起来的,没有表头的
* 加的比较急 2004.10.14
*}
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[[]ASQLNOTITLE[]]*[[]/ASQLNOTITLE[]]', MatchWildcards := true);
DocText := MyWord.Selection.Text;
while MyWord.Selection.Find.Found do
begin
DocText := Copy(DocText, 14, Length(DocText) - 27);
sSQL := DocText;
{ 本想在此函数最开始的时候就替换这些参数,
但自做主张的 WORD 总是把 ' 换成 “,太讨厌了 }
if sParam.Count = sValue.Count then
for jLoop := 0 to sParam.Count - 1 do
ReplaceString(sSQL, '$SQL' + sParam.Strings[jLoop], sValue.Strings[jLoop], false);
with dmMain.DA.NewCDS('WordReportSQL', sSQL) do
begin
if (FieldCount = 1) and (RecordCount = 1) then
MyWord.Selection.Text := Fields[0].AsString
else
begin
if RecordCount = 0 then
MyWord.Selection.Text := ''
else
begin
MyRange := MyWord.Selection.Range;
MyTable := WordDoc.Tables.Add (Range:= MyRange, NumRows:=RecordCount, NumColumns:=FieldCount);
First;
iRow := 1;
while not Eof do
begin
for iCol := 0 to FieldCount - 1 do
begin
MyTable.Cell(iRow, iCol + 1).Range.InsertAfter(Fields[iCol].AsString);
end;
Next;
inc(iRow);
end;
end;
end;
end;
dmMain.DA.DeleteCDS('WordReportSQL');
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[[]ASQLNOTITLE[]]*[[]/ASQLNOTITLE[]]', MatchWildcards := true);
DocText := MyWord.Selection.Text;
end;
{ 处理用 [SQL] 和 [/SQL] 括起来的 }
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[[]SQL[]]*[[]/SQL[]]', MatchWildcards := true);
DocText := MyWord.Selection.Text;
while MyWord.Selection.Find.Found do
begin
DocText := Copy(DocText, 6, Length(DocText) - 11);
sSQL := DocText;
{ 本想在此函数最开始的时候就替换这些参数,
但自做主张的 WORD 总是把 ' 换成 “,太讨厌了 }
if sParam.Count = sValue.Count then
for jLoop := 0 to sParam.Count - 1 do
ReplaceString(sSQL, '$SQL' + sParam.Strings[jLoop], sValue.Strings[jLoop], false);
with dmMain.DA.NewCDS('WordReportSQL', sSQL) do
begin
if (FieldCount = 1) and (RecordCount = 1) then
MyWord.Selection.Text := Fields[0].AsString
else
begin
if RecordCount = 0 then
MyWord.Selection.Text := ''
else
begin
MyRange := MyWord.Selection.Range;
MyTable := WordDoc.Tables.Add (Range:= MyRange, NumRows:=RecordCount + 1, NumColumns:=FieldCount);
First;
for iCol := 0 to FieldCount - 1 do
begin
MyTable.Cell(1, iCol + 1).Range.InsertAfter(Fields[iCol].FieldName);
end;
iRow := 2;
while not Eof do
begin
for iCol := 0 to FieldCount - 1 do
begin
MyTable.Cell(iRow, iCol + 1).Range.InsertAfter(Fields[iCol].AsString);
end;
Next;
inc(iRow);
end;
end;
end;
end;
dmMain.DA.DeleteCDS('WordReportSQL');
MyWord.Selection.SetRange(Start:=0, End:=0);
MyWord.Selection.Find.Execute(FindText := '[[]SQL[]]*[[]/SQL[]]', MatchWildcards := true);
DocText := MyWord.Selection.Text;
end;
finally
MyWord.Visible := true;
MyWord := Unassigned;
end;
end; |