2011-07-04 4 views
0

아무도 도와 드릴까요?델파이 5 월 MS 워드 2010 mailmerge

델파이 5로 작성된 일부 소프트웨어를 상속 받았으며 데이터베이스에서 멤버 데이터와 필드 (.ADT 파일)를 병합하여 사용할 수 있습니다.

내가 말 한

"그 방법 해당 개체를 사용할 수 없습니다"

그것은이 문서를로드하지 않습니다 2010을 제외한 Word의 모든 버전과 잘 작동 오류를 보여줍니다 솔루션은 미리 설정된 구성 요소 OpWord 및 OpDataSet을 Ole 변형으로 대체하는 것입니다. 나는 OpWord를 사용하여 OpWord를 사용했다 :

wrdApp : CreateOleObject ('Word.Application');

이제 문서가로드되지만 병합 필드 데이터는 없습니다. 누구나 데이터베이스에서 데이터를 추출하는 방법을 알려 줄 수 있습니까? OpDataSet은 단순히 테이블을 가리키는 것처럼 보입니다.

또는 누구든지 내가 시도하는 것보다 더 나은 솔루션을 제안 할 수 있습니다. 델파이에 아주 새로운 해요 그래서 난 내 머리

편집을 통해 ABIT에있어 (정보를 요청) 필요한 경우 내가 자세한 내용과 코드가 미안

.

구성 요소는 TOpExcel, TOpOutlook 및 기타와 함께 OfficePartner라는 라이브러리에 속한 것으로 나타납니다. ...

난이 도움이되기를 바랍니다

{Use Table4 as we can Set a range on it} 
    Table4.SetRange([Table1.FieldByName('Member Id').AsString],[Table1.FieldByName('Member Id').AsString]); 

    {Open Word} 
    OpWord1.Connected := True; 

    {Open the Test Document} 
    OpWord1.OpenDocument(DocumentDirectory + '\' + Form30.ListBox1.Items[Form30.ListBox1.ItemIndex]); 

    {Populate the Test Document} 
    OpWord1.ActiveDocument.MailMerge.OfficeModel := OpDataSetModel1; 
    OpWord1.ActiveDocument.PopulateMailMerge; 
    OpWord1.ActiveDocument.ExecuteMailMerge; 

:

.DOC 표에서 병합 필드의 데이터를 열고 인구, Form30에 팝업 ListPane에서 선택 4. 표 1은 회원 데이터베이스입니다

+0

OpWord 및 OpDataSet 라이브러리가 어디서/어느 라이브러리에서 왔는지 (더 이상 알 수없는 델파이 5 컴포넌트가 아닙니다) 어떤 코드가 없으면 누구나 추측 할 수 있습니다. 다양한 COM 객체 (app이라는 단어뿐만 아니라)를 만드는 방법과 문서를 여는 방법 및/또는 병합을 시작하는 방법을 보여줍니다. –

+0

답장을 보내 주셔서 감사합니다. 죄송합니다. 그런 긴 질문을 쓰고 싶지는 않지만 위 편집에서 일부 코드를 포함 시켰습니다. – notidaho

답변

1

다음은 D6 용으로 다시 사용했던 단어 편지 병합을위한 약간의 절차입니다. 그냥 스 니펫이며 일부 클래스에 포함시켜야하므로 더 이상 Delphi가 없으므로 컴파일하여 작동하는지 확인하십시오 , 어쨌든 여기에 도움이되기를 바랍니다.

procedure MailMergeWord; 
var 
    WordApp: TWordApplication; 
    WordDoc: TWordDocument; 
    doc : WordDocument; 
    FileName: OleVariant; 
    xx: integer; 
begin 
    WordApp := TWordApplication.Create(nil); 
    WordApp.ConnectKind := ckNewInstance; 
    WordDoc := TWordDocument.Create(WordApp); 
    FileName := 'TemplateDoc.doc'; 

    doc := WordApp.Documents.Open(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam 
           ,EmptyParam,EmptyParam,EmptyParam,EmptyParam 
           ,EmptyParam); 

    WordDoc.ConnectTo(Doc); 
    for xx := 1 to WordDoc.Fields.Count do 
    WordDoc.Fields.Item(xx).Result.Text := OnWordVariable(WordDoc.Fields.Item(xx).Code.Text); 
    WordDoc.PrintOut; 
    WordDoc.Free; 
    WordApp.Free; 
end; 


function OnWordVariable(varName: string): string; 
begin 
    Result := 'Value based on variable name'; 
end; 
+0

입력 해 주셔서 감사합니다. 개체 및 특성에 대한 내 이해가 계속 실패하지만 사용자의 필드 데이터가 WordDoc.Fields에있는 것을 볼 수 없으며 서식 파일로 전달됩니다. 분에서 나는 테이블에서 데이터를 전달할 DataSourceFile을 만들려고하지만 StringLists와 섞여있다. 안녕 – notidaho

+1

나는 당신을 이해하지만, OnWordVariable 함수는 Word 문서 "TemplateDoc.doc"에 정의 된 모든 필드에 대해 호출되며 OnWordVariable 함수는 단지 예일뿐입니다. 워드 doc의 필드를 채우기 위해 자신 만의 로직을 제공해야합니다. word doc에 정의 된 필드 이름에. 왜이 DataSourceFile을하는지 보지 말고, 테이블에 단어와 필드 이름이 같다고 가정 해 보겠습니다. 이렇게하면 간단 할 수 있습니다. Result : = table.FieldByName ("varName"). –

+0

환상적! 감사합니다 안토니오 ...내 고객 템플릿 wordvariables은 실제로 실제로 테이블의 필드 이름과 일치하지 않으므로 추가 밑줄을 제거하거나 새 템플릿을 만들어야합니다. 이 방법이 효과가 있다면 질문이 하나 더 생깁니다. - 고객이 자체 템플릿을 만들고 빈 단어 문서를 열면 병합 필드 옵션에서 어떻게 피드 할 수 있습니까? 내가 sourcekb 기술을 통해 이것을 avhieved http://support.microsoft.com/kb/229310에서 복사하지만 wrdDoc.Merge.Fields를 사용하여 더 간단한 방법은 무엇입니까? 고마워요. – notidaho