2011-03-22 3 views
4

Delphi XE에서 som 자동화를 수행하는 동안 두 개의 문서가 동시에 열립니다. 한 문서의 주어진 범위의 내용을 다른 문서의 다른 범위로 복사하고 싶습니다. 어떻게해야합니까? 나는 목차를 대체 할 수있는 일이OLE 자동화 : 클립 보드를 사용하지 않고 Word 문서간에 텍스트를 복사하는 방법

procedure TForm1.ManipulateDocuments; 
var 
    vDoc1,vDoc2 : TWordDocument; 
    vFilename : olevariant; 
    vRange1,vRange2 : Range; 
begin 
    vDoc1 := TWordDocument.Create(nil); 
    vDoc2 := TWordDocument.Create(nil); 
    try 
    vFilename := 'c:\temp\test1.doc'; 
    vDoc1.ConnectTo(FWordApp.Documents.Open(vFilename,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam)); 

    vFilename := 'c:\temp\test2.doc'; 
    vDoc2.ConnectTo(FWordApp.Documents.Open(vFilename,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam)); 

    vRange1 := GetSourceRange(vDoc1); 
    vRange2 := GetDestinationRange(vDoc2); 

    vRange2.CONTENTS := vRange1.CONTENTS; //What should I substitute for CONTENTS? 
    finally 
    vDoc1.Free; 
    vDoc2.Free; 
    end; 
end; 

있습니까 :

다음 코드를 고려? 포맷팅, 북마크, 필드 코드 등을 복사하고자하므로 텍스트를 사용할 수 없습니다. 다른 방법으로해야합니까? 어떤 제안?

답변

3

이전 버전의 Word에서 사용할 수있는 방법은 모르지만 최신 버전 (2007 이상)에서는 export a range을 문서에서 조각 파일로 변환 한 다음 import 다른 문서에서 가져올 수 있습니다. 초기 바인딩을 원하면 형식 라이브러리 (msword.olb)를 가져와야 할 수도 있습니다. Delphi XE에 형식 라이브러리가 있는지 여부는 알 수 없습니다. 그렇지 않으면 코드는 다음과 같습니다 내 테스트와

function GetTempFileName(Prefix: string): string; 
begin 
    SetLength(Result, MAX_PATH); 
    GetTempPath(MAX_PATH, PChar(Result)); 
    windows.GetTempFileName(PChar(Result), PChar(Prefix), 0, PChar(Result)); 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
const 
// wdFormatDocument = 0; 
    wdFormatRTF = $00000006; 
var 
    WordApp : OleVariant; 
    fragment: string; 
    vDoc1, vDoc2: OleVariant; 
    vRange1, vRange2: OleVariant; 
begin 
    try 
    WordApp := GetActiveOleObject('Word.Application'); 
    except 
    WordApp := CreateOleObject('Word.Application'); 
    end; 
    WordApp.Visible := True; 

    vDoc1 := WordApp.Documents.Open(ExtractFilePath(Application.ExeName) + 'test1.doc'); 
    vRange1 := vDoc1.Range(20, 120);  // the export range 
    fragment := GetTempFileName('frg'); 
    vRange1.ExportFragment(fragment, wdFormatRTF); 
    try 
    vDoc2 := WordApp.Documents.Open(ExtractFilePath(Application.ExeName) + 'test2.doc'); 
    vRange2 := vDoc2.Range(15, 15); // where to import 
    vRange2.ImportFragment(fragment); 
    finally 
    DeleteFile(fragment); 
    end; 
end; 

를, '문서'형식 오류 (XML 형식을 삽입 할 수없는 같은), RTF 형식의 따라서 사용을 던졌다.

편집 : 이전 버전의

, 다른 문서의 선택으로 하나 개의 문서에서 명명 된 선택을 삽입 할 수있을 것으로 보인다. 결과 중 하나가 텍스트의 중간에있는 경우 서식을 적용해도 결과가 완벽하지 않은 것 같습니다. 하지만 그렇지 않으면 잘 작동하는 것 같습니다. 당신이 Office Open XML -format를 사용할 수있는 경우

... 
    WordApp.Visible := True; 

    vDoc1 := WordApp.Documents.Open(ExtractFilePath(Application.ExeName) + 'test1.doc'); 
    vRange1 := vDoc1.Range(20, 188);     // the transfer range 
    vDoc1.Bookmarks.Add('TransferSection', vRange1); // arbitrary bookmark name 

    vDoc2 := WordApp.Documents.Open(ExtractFilePath(Application.ExeName) + 'test2.doc'); 
    vRange2 := vDoc2.Range(103, 104);   // where to import the bookmark 
    vRange2.Select; 
    vDoc2.ActiveWindow.Selection.InsertFile(vDoc1.FullName, 'TransferSection'); 

    vDoc1.Bookmarks.Item('TransferSection').Delete; // no need for the bookmark anymore 
  
+0

나는이 함수들 (exportfragment/importfragment)을 알아 채었고, 그들은 나의 필요에 완벽 할 것이다. 불행히도, Word 2007 나를위한 옵션이 아닙니다. 우리의 솔루션은 이러한 기능을 사용할 수 없었던 Word 2003을 실행하는 사용자 (어쩌면 이전 버전)에게도 제공되어야합니다. 그러나 어쨌든 고마워. 지금까지의 가장 좋은 제안 :-) –

+0

업데이트 : 다른 답변이 없으므로이 질문을 최고로 받아 들일 것입니다. 그래도 클립 보드를 사용하거나 외부 파일을 사용하지 않고이 작업을 수행하는 것은 좋지 않습니다. 그것은 매우 기본적인 것처럼 보입니다 : -/ –

+0

@Svein - 저는 대안으로 답변을 업데이트했습니다. 그래도 여전히 만족스럽지 않다면, 태그에'msword '를 추가하고 잠시 질문을 대답하지 않는 것이 좋습니다. –

-3

왜 클립 보드를 사용하지 않습니까? vDoc1에서 모든 텍스트가 선택된 경우 클립 보드에 복사하려면 vDoc1.copy라는 간단한 호출이 필요합니다. 마찬가지로 클립 보드의 내용을 두 번째 문서로 복사하는 것은 간단한 호출 인 vDoc2.paste를 필요로합니다. 클립 보드 버퍼에는 모든 서식 정보가 저장됩니다.

+3

우선 클립 보드를 사용하면 사용자가 무엇을 넣었는지 삭제할 것입니다. 해야 할 좋은 일이 아닙니다. 또한이 응용 프로그램은 클립 보드가 로컬 클립 보드와 동기화되는 터미널 서버에서 실행되기 때문에 성능 문제가 발생합니다. –

+2

-1 클립 보드는 사용자가 아니라 사용자에게 속합니다. 사용자가 클립 보드를 시작하지 않으면 (예 : 복사 또는 잘라 내기 또는 붙여 넣기) 클립 보드의 내용에 영향을주는 것은 절대 수행하지 않아야합니다. –

1

(예. Word 2007에서 도입 된 DOCX 파일 형식), 당신은 자동화하지 않고이 작업을 수행 할 수 있습니다. 이전 2007

Word 버전의 Word 2003, 2002 DOCX-파일을 사용하고 2000

DOCX 파일이 실제로 여러 XML 파일이 포함 된 압축 파일 인 것이다 이는 compatibility pack 설치해야합니다. docx 파일의 확장명을 .docx에서 .zip으로 변경하고 예를 들어이 파일을여십시오. WinZip.

그래서 ... docx-file을 압축 해제하고 필요한 xml 부분을 가져 오십시오. 순수 문자열 또는 XML 문서입니다. 그런 다음이 xml 부분을 다른 docx 파일에 삽입 할 수 있습니다. 을 알아야합니다. xml 구조체에이 있으면 xml을 집어 넣을 수 있습니다. 이것은 문서 구조를 얼마나 잘 알고 있는지와 사용자가 문서에서 얼마나 많은 편집을 할 수 있는지에 달려 있습니다.

Word에서 중복 책갈피 이름 등을 처리하는 방법을 모르겠다.

0

비슷한 문제를 파헤 치면서이 문제에 대한 표준 해결책을 찾은 것 같습니다. Range 객체의 FormattedText 속성은 정확히 무엇입니까?그냥 사용

vRange2.FormattedText := vRange1; 

및 vRange1의 내용은 vRange2에 복사됩니다. 또한,이 작동합니다 :

vRange2 := vRange1; 

두 번째 문은 서식을 복사하지 않지만.

관련 문제