Delphi + Word 솔루션 참조 프로젝트 중에 제가 만든 몇 가지 기능은 모두가 Word에 대해 질문하는 것을 보았습니다. 이제 꺼내서 모두와 공유해 보세요. (친구들이 좀 더 새로운 기능을 추가하거나, 패키지나 라이브러리 등으로 만들어서 모두가 더 편리하게 사용할 수 있었으면 좋겠습니다. 나에겐 시간이 없어요 ㅎㅎ) 사용하기 전에 빈 WORD 파일을 만들어주세요. 필요에 따라 템플릿으로 다양한 형식과 텍스트가 파일에 설정됩니다. 또한 PRnWordTable의 매개변수는 TDBGridEh 형태의 컨트롤로 Ehlib2.6에서 따온 것이다. shFileCopy 함수(파일 복사에 사용)와 guiInfo 함수(메시지박스 표시에 사용)도 직접 작성했고, 코드도 첨부되어 있습니다. 샘플 코드는 다음과 같습니다. 코드 완성 기능: 1. 인쇄 템플릿의 "#TITLE#" 텍스트를 "Demo Code 1"로 교체합니다. 2. 현재 DBGridEh1 컨트롤에 의해 표시된 내용을 문서 끝에 삽입합니다. 3. 빈 줄을 삽입합니다. 4. 문서 끝에 새 텍스트 줄을 삽입합니다. 5. PrnWordBegin('C:/Print template.DOC','C:/Target file 1.DOC인 경우 문서에서 빈 줄을 제거합니다. ') 그런 다음 시작 PrnWordReplace('#TITLE#','데모 코드 1'); PrnWordInsert(''); PrnWordReplace('^p^p','^ p ',true); end; 소스코드는 다음과 같습니다. //워드 인쇄(선언부) wDoc,wApp:Variant; function PrnWordBegin(tempDoc,docName:String):boolean; function PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean; function PrnWordInsert(lineText:String;bNewLine:boolean=true) 부울;오버로드; 함수 PrnWordInsert(var imgInsert:TImage;sBookMark:String=''):boolean;overload; function PrnWordInsert(var ChartInsert:TChart;sBookMark:String=''):boolean;overload; function PrnWordTable(var dbG:TDBGridEh;sBookMark:String='' ):부울; 프로시저 PrnWordSave; //워드 인쇄(구현 부분) { 함수: 템플릿 파일 tempDoc을 기반으로 새 대상 파일 docName을 생성 하고 파일을 엽니다 . } function PrnWordBegin(tempDoc,docName:String):boolean;begin result:=false; //템플릿 복사 if tempDoc<>'' then if shFileCopy(tempDoc, docName)가 아닌 후 종료; //Word에 연결 try wApp:=CreateOleObject('Word.application') Except guiInfo('먼저 Microsoft Word를 설치하십시오.'); exit; end; //tempDoc=''이면 열기를 시도하고 //새 문서를 만듭니다. wDoc.SaveAs(docName); end else start //wDoc:=wApp을 엽니다. Documents.Open(docName); end; guiInfo('템플릿을 열지 못했습니다. 템플릿이 올바른지 확인하세요. '); end; wApp.Visible:=true; result:=true;end; { 함수: docText 콘텐츠를 교체하기 위해 bSimpleReplace : true이면 새로운 텍스트를 교체합니다 . 텍스트가 래핑되었습니다. } function PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean;var i:Integer;begin if bSimpleReplace //간단한 처리를 시작하고, 교체 작업을 직접 수행합니다. wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := docText; 텍스트 :=newText; wApp.Selection.Find.Forward := 참; wdFindContinue; wApp.Selection.Find.MatchCase := False; wApp.Selection.Find.MatchWord := true; Find.MatchWildcards := False; wApp.Selection.Find.MatchSoundsLike := False; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); result:=false; end; Lines.Clear; reWord.Lines.Add(newText); //교체할 위치 뒤를 찾습니다. wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Text := docText; wApp.Selection.Find.Replacement.Text := ''; wApp.Selection.Find.Wrap := wdFindContinue; .Find.Format := 거짓; wApp.Selection.Find.MatchCase := 거짓; wApp.Selection.Find.MatchWholeWord := False; wApp.Selection.Find.MatchWildcards := False; wApp.Selection.Find. MatchAllWordForms := False; wApp.Selection.Find.Execute; wApp.Selection.MoveRight(wdCharacter,1); //reWord.Lines.Count-1에 i:=0에 대해 한 줄씩 삽입을 시작합니다. 시작 //현재 줄을 삽입합니다. wApp.Selection.InsertAfter(reWord.Lines[i ]) ; //마지막 줄을 제외하고 i<reWord.Lines.Count-1 then wApp.Selection.InsertAfter(#13) end; //대체 표시 삭제 wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := docText := ''; .Selection.Find.Forward := 참; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format := False; wApp.Selection.Find.MatchWholeWord := true; wApp.Selection.Find MatchWildcards := 거짓; wApp.Selection.Find.MatchSoundsLike := 거짓; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); 결과:=true; { 기능: TDBGridEh 에 의해 현재 표시된 내용을 인쇄합니다. TDBGridEh 컨트롤의 형식과 내용을 기반으로 문서의 sBookMark 북마크 에 Word 테이블이 자동으로 생성됩니다. 현재는 셀 정렬, 여러 줄 제목(2개)을 지원할 수 있습니다. sBookMark : Word 테이블에 삽입할 북마크의 이름 } function PrnWordTable(var dbG:TDBGridEh; sBookMark :String=''):boolean;var iCol,iLine,i,j,k:Integer; wTable,wRange:longint; iGridLine,iTitleLine:Integer; getTextText:String;getTextDisplay:boolean; titleSplit,titleCol:Integer; 정수;마지막 제목:문자열;시작 result:=false; try //테이블의 열 수 계산(숨겨진 열 제외) iTitleLine:=1; //i:=0에서 dbG.Columns.Count-1에 대해 항상 기본값은 1입니다. dbG.Columns[i].Visible이면 시작 iCol:=iCol+1 //테이블의 행 수를 계산합니다(숨겨진 열 제외). dbG.DataSource.DataSet.Active then iLine:=dbG.DataSource.DataSet.RecordCount else iLine:=0; iGridLine:=iLine+iTitleLine+dbG.FooterRowCount; //sBookMark=''인 경우 삽입 지점을 지정한 다음 시작합니다. // 문서 끝에서 iRangeEnd:=wDoc.Range.End-1; if iRangeEnd<0 then iRangeEnd:=0; wRange:=wDoc.Range(iRangeEnd,iRangeEnd); end else start //북마크에서 wRange:=wDoc.Range.Goto(wdGoToBookmark,,,sBookMark) end; Add(wRange,iGridLine,iCol); wTable.Columns.AutoFit; //제목 행 k:=1; j:=1 to dbG.Columns.Count dbG.Columns[j-1].Visible인 경우 시작하고 dbG.UseMultiTitle인 경우 시작한 다음 titleList:=strSplit(dbG.Columns[j-1].Title.Caption,'을 시작합니다. |'); wTable.Cell(1,k).Range.InsertAfter(titleList.Strings[0]); wTable.Cell(1,k).Range.InsertAfter(dbG.Columns[j-1].Title.Caption); //dbG.Columns[j-1].Title.Alignment=taCenter인 경우 셀 정렬을 설정하고 wTable을 설정합니다. Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter else if dbG.Columns[j-1].Title.Alignment=taRightJustify 다음 wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight else if dbG.Columns[j-1].Title.Alignment=taLeftJustify 다음 wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify; k:=k+1; end; //iLine>0인 경우 dbG.DataSource.dataset.DisableControls; . DataSource.DataSet.First; for i:=1 to iLine 수행 k:=1 for j:=1; dbG.Columns.Count dbG.Columns[j-1].Visible인 경우 시작하고 dbG.Columns[j-1].FieldName<>''인 경우 시작하고 //빈 열로 인한 오류 방지 시작 //열이 있는 경우 고유한 형식 지정 표시 함수가 있는 경우 표시 함수를 호출하여 표시 문자열 getTextText:=''를 가져옵니다. 할당된(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) 다음 시작 dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName),getTextText,getTextDisplay); wTable.Cell(i+iTitleLine,k).Range.InsertAfter(getTextText); end else start //데이터베이스 내용을 사용하여 wTable.Cell(i+iTitleLine,k).Range.InsertAfter(dbG.DataSource.DataSet.FieldByName (dbG.Columns[j-1].FieldName).AsString); 끝;