>  기사  >  백엔드 개발  >  Windows 시스템에서 PHP를 사용하여 Word 문서를 생성하는 방법에 대한 자습서

Windows 시스템에서 PHP를 사용하여 Word 문서를 생성하는 방법에 대한 자습서

WBOY
WBOY원래의
2016-07-25 08:45:00971검색

준비

먼저 Windows 시스템에 일반적인 WAMP 환경이 설치 및 구성되어 있는지 확인하세요. Interop은 순전히 Windows 기능이므로 Windows 플랫폼에서 Apache와 PHP를 빌드하겠습니다. 이 예에서는 설치 및 구성이 매우 쉬운 EasyPHP 14.1을 사용했습니다.

다음으로 Microsoft Office를 설치하겠습니다. 버전이 꼭 필요한 것은 아닙니다. Office 2013 Professional을 사용하고 있지만 2007 이후의 모든 Office 버전이 작동합니다.

그런 다음 Interop 애플리케이션 개발을 위한 라이브러리(PIA(Priority Interaction Components)라고도 함)가 설치되어 있는지 확인해야 합니다. 이를 확인하기 위해 탐색기를 열고 어셈블리를 찾으면 다음과 같은 설치된 PIA 분기가 표시됩니다.

201573144223171.png (1050×656)

Microsoft.Office.Interop.Word 항목을 볼 수 있습니다(이 스크린샷에 밑줄이 그어져 있음). 이것이 이 예에서 사용할 PIA입니다. "이름", "버전" 및 "공개 키 토큰"에 특별한 주의를 기울이십시오. 우리는 PHP 스크립트에서 이를 사용할 것입니다.

이 디렉토리에서는 프로그래밍(PHP뿐만 아니라 VB.net, C# 등)에 사용되는 다른 PIA(전체 Office 제품군 포함)도 볼 수 있습니다.

이 목록에 Microsoft.Office.Interop의 전체 패키지가 포함되어 있지 않으면 Office를 다시 설치하고 설치에 PIA를 포함할 수도 있습니다. 이 패키지를 수동으로 다운로드하여 설치할 수도 있습니다. 자세한 설치 단계는 이 MSDN 페이지에서 확인할 수 있습니다.

참고: Microsoft Office 2010 PIA 재배포 가능 패키지만 별도로 다운로드하여 설치할 수 있습니다. 이 패키지의 PIA 버전은 14.0.0입니다. 버전 15는 Office를 설치해야만 사용할 수 있습니다.

마지막으로 php.ini 파일에서 PHP 확장 php_com_dotnet.dll을 활성화하고 서버를 다시 시작해야 합니다.

이제 프로그래밍을 시작할 수 있습니다.

HTML 양식

이 데모는 주로 백그라운드 처리에 중점을 두기 때문에 프런트엔드 디스플레이에 간단한 HTML 형식을 사용합니다.

201573144251848.png (889×757)

"이름"을 입력하기 위한 텍스트 상자, "성별"에 대한 라디오 버튼 그룹, "나이"에 대한 필드 값 컨트롤 및 "메시지" 작성을 위한 텍스트 필드가 있습니다. 마지막으로 "제출" 버튼이 필요합니다. .

파일 이름을 "index.html"로 지정하고 URL을 통해 직접 파일에 액세스할 수 있도록 가상 호스트의 루트 디렉터리에 저장합니다(예: http://test/test/interop

백스테이지

백엔드 PHP 파일은 우리가 논의할 핵심 부분입니다. 아래 코드를 먼저 게시한 후 차근차근 설명해 드리겠습니다

  1. $inputs = $_POST;
  2. $inputs['printdate']=''; POST 변수에 "printdate"가 없으므로 PHP 알림을 피하기 위한 더미 값입니다.
  3. $assemblies = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
  4. $class = 'Microsoft.Office.Interop.Word.ApplicationClass';
  5. $w = new DOTNET($assemble, $class);
  6. $w-> visible = true;
  7. $fn = __DIR__ . '\template.docx';
  8. $d = $w->Documents->Open($fn);
  9. echo "문서가 열렸습니다.

    ";
  10. $flds = $d->Fields;
  11. $count = $flds->Count;
  12. echo "이 문서에는 $count 필드가 있습니다.";
  13. echo "
      ";
    • $mapping = setupfields();
    • foreach($flds를 $index로) =>$f)
    • {
    • $f->Select();
    • $key = $mapping[$index];
    • $value = $inputs[$key];
    • if ($key == '성별')
    • {
    • if ($value == 'm')
    • $value = 'Mr.';
    • else
    • $value = ' Ms.';
    • }
    • if($key=='printdate')
    • $value= date ('Y-m-d H:i:s');
    • $w ->Selection->TypeText($value);
    • echo "
    • Mappig 필드 $index: 값이 $value
    • 인 $key";
    • }
    • echo "< /ul>";
    • echo "매핑 완료!

      ";
    • echo "인쇄 중입니다...
      ";
    • $d->PrintOut();
    • sleep(3);
    • echo "완료!";
    • $w->Quit(false);
    • $w=null;
    • function setupfields()
    • {
    • $mapping = array();
    • $mapping[0] = 'gender';
    • $mapping[1 ] = '이름';
    • $mapping[2] = '나이';
    • $mapping[3] = 'msg';
    • $mapping[4] = 'printdate';
    • $mapping 반환;
    • }
코드 복사

양식에 전달된 값을 가져오는 데 사용되는 $inputs 변수를 설정한 후 인쇄 날짜를 저장하기 위한 더미 값을 만들어야 합니다. 이 변수가 필요한 이유는 나중에 논의하겠습니다. 이제 다음과 같은 4줄의 내용이 표시됩니다. 더 중요한 코드:

  1. $assemblies = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
  2. $class = 'Microsoft .Office.Interop.Word.ApplicationClass';
  3. $w = new DOTNET($assemble, $class);
  4. $w->visible = true;
코드 복사

PHP에서 COM을 조작하려면 어셈블리에서 클래스 인스턴스를 요청해야 합니다. 우리의 경우 Word를 사용하여 작업하겠습니다. 이전 스크린샷에 표시된 코드를 고려하면 완전히 서명된 Word PIA를 구성할 수 있습니다.

  • "이름", "버전", "공개 키 토큰"은 "c:Windowsassemble"을 탐색할 때 표시되는 정보입니다.
  • "Cultrue"는 항상 중립적입니다.


클래스 호출 후 컴파일된 파일의 접미사는 일반적으로 ApplicationClass입니다.

다음 두 단계를 설정하여 단어 개체를 초기화할 수 있습니다.

먼저 visible 속성을 true로 설정하면 단어 개체를 배경에 저장하거나 전경에 표시할 수 있습니다.

그런 다음 처리할 문서를 열고 이를 $d 변수로 인스턴스화합니다.

문서 개체에 html 형식의 텍스트를 기반으로 문서 내용을 추가합니다. 여기서 일부 매개변수를 설정할 수 있습니다.
최악의 방법은 PHP 페이지의 모든 내용을 하드코딩한 다음 이를 개체라는 단어에 추가하는 것입니다. 다음과 같은 이유로 이 방법을 사용하지 않는 것이 좋습니다.

1 코드는 유연하지 않습니다. PHP 콘텐츠를 변경하려면 스크립트를 다시 수정해야 합니다.
2 제어 레이어와 디스플레이 레이어의 분리를 위반합니다.
3. 단어 내용의 형식(정렬, 글꼴, 스타일 등)을 설정해야 하는 경우 이 방법을 사용하면 코드 줄 수가 크게 늘어나고 프로그래밍 방식으로 스타일을 수정하는 것이 매우 번거롭습니다.


또 다른 방법은 "검색-바꾸기"를 사용하는 것입니다. PHP에 내장된 이 기능은 매우 강력합니다. 단어 문서를 만들고 교체해야 하는 자리 표시자 콘텐츠 주위에 구분 기호를 배치할 수 있습니다. 예를 들어, 다음 내용이 포함된 문서를 만듭니다.

  1. {{name}}
코드 복사

PHP에서는 양식 제출에서 얻은 "이름" 값으로 간단히 대체합니다. 이 접근 방식은 첫 번째 옵션의 단점을 방지합니다. 올바른 구분 기호를 찾으면 됩니다. 이 예에서는 사용된 템플릿이 워드 문서라는 점을 제외하면 템플릿 렌더링을 수행하는 것과 더 유사합니다.


세 번째 옵션은 제가 추천하는 옵션이며 Word의 프리미엄 테마입니다. 필드를 사용하여 자리 표시자를 나타내고 PHP 코드에서 해당 양식 값으로 필드를 직접 업데이트합니다.

이 방법은 유연하고 빠르며 Word의 모범 사례를 따릅니다. 또한 파일의 전체 텍스트 검색을 방지하여 성능 향상에 도움이 됩니다. 이 옵션에도 단점이 있습니다.

간단히 말하면 Word는 출시 이후 명명된 인덱스 필드를 지원한 적이 없습니다. Word 문서에서 생성한 필드에 이름을 제공하지만 여전히 숫자 아래 첨자를 사용하여 각 필드에 액세스합니다. 이는 또한 필드 인덱스와 양식 필드 매뉴얼 이름 사이의 매핑을 수행하기 위해 전용 함수(setupfields)를 사용해야 하는 이유를 설명합니다


Word 문서에 필드를 삽입하는 방법을 알아보려면(사용자 정의된 버전을 보려면 여기를 클릭하십시오) 관련 Word 도움말 항목 및 설명서를 참조하십시오. 이 데모에는 5개의 MERGEFIELD 필드가 있는 문서가 있습니다. 또한 쉽게 액세스할 수 있도록 설명서와 PHP 스크립트를 하나의 디렉터리에 배치합니다.

printdate 필드에는 해당 양식 필드가 없다는 점에 유의하세요. 이것이 우리가 $inputs 배열의 키로 가짜 printdate를 추가하는 이유입니다. 이 키가 없어도 스크립트는 계속 실행될 수 있지만 인덱스 printdate가 $inputs 배열에 존재하지 않는다는 메시지가 표시됩니다.

양식 데이터를 사용하여 필드 값을 업데이트한 후 다음 명령을 사용하여 문서를 인쇄합니다.

  1. $d->PrintOut();
코드 복사

PrintOut 메소드에는 여러 가지 선택적 매개변수가 있습니다. 여기서는 가장 간단한 형식을 사용합니다. 그러면 Windows 시스템에 연결된 기본 프린터로 사본이 인쇄됩니다.


PrintPreview를 사용하여 인쇄 미리보기를 할 수 있습니다. 물론 완전히 자동화된 시나리오에서는 PrintOut을 직접 사용하여 인쇄합니다.

또한 인쇄 작업이 백그라운드를 완전히 종료하는 데 시간이 걸리기 때문에 워드 응용 프로그램을 종료하기 전에 잠시 기다려야 합니다. 지연 없이(3) $w->Quit이 즉시 실행되고 인쇄 작업이 즉시 종료됩니다.

마지막으로 $w->Quit(false)를 호출하여 PHP 스크립트 호출을 통해 단어 응용 프로그램을 닫도록 선택합니다. 여기에 제공된 유일한 매개변수는 종료하기 전에 변경 사항을 저장할지 여부를 나타내는 것입니다. 문서를 변경했지만 다른 사용자의 입력을 위한 깔끔한 템플릿을 원하기 때문에 변경 사항을 저장하고 싶지 않습니다.

코딩이 끝나면 양식 페이지를 로드하고 일부 내용을 입력한 후 양식을 제출할 수 있습니다. 아래 스크린샷은 Word 문서를 업데이트하는 동안 PHP 스크립트의 출력을 보여줍니다.

201573144442664.png (889×757)

201573144502426.png (1663×843)

코딩 속도를 높이고 PIA에 대한 이해를 높입니다

PHP는 약한 유형의 언어입니다. COM 개체는 개체 유형입니다. PHP 코딩 프로세스에서는 개체에서 코드 자동 제안 및 완성 기능을 사용할 수 없습니다. Word 응용 프로그램, 문서 또는 필드에서도 마찬가지입니다. 우리는 그것이 어떤 기능을 가지고 있는지, 어떤 방법을 지원하는지 모릅니다.


이로 인해 개발 속도가 크게 저하됩니다. 개발 속도를 높이려면 우선 C#에서 개발하는 기능을 PHP 코딩으로 마이그레이션하는 것이 좋습니다. 여기에서 다운로드할 수 있는 "#develop"이라는 무료 C# IDE를 추천합니다. #develop이 더 작고, 간단하고, 반응성이 더 좋기 때문에 VS보다 이 소프트웨어를 선호합니다.

C# 코드를 PHP로 마이그레이션하는 것은 전혀 무섭지 않습니다. 먼저 몇 가지 C# 코드를 보여드리겠습니다.
코드 복사 코드는 다음과 같습니다: Word.Application w=new Word.Application();
w.Visible=true;

문자열 경로=Application.StartupPath "\template.docx";

Word.Document d=w.Documents.Open(path) as Word.Document;

Word.Fields flds=d.Fields;
int len=flds.Count;

foreach(flds의 Word.Field f)
{
f.선택();
int i=f.Index;
w.Selection.TypeText("...");
}

C# 코드가 이전에 보여드린 PHP 코드 베이스와 정확히 동일하다는 것을 알 수 있습니다. C#은 강력한 형식의 언어이므로 일부 형식 변환 문을 볼 수 있으며 변수에 형식을 명시적으로 할당해야 합니다.

코드 유형을 사용하면 코드의 자동 프롬프트 및 자동 코드 완성 기능을 즐길 수 있으므로 개발 속도가 크게 향상됩니다.


더 빠른 PHP 개발을 제공할 수 있는 또 다른 방법은 Word 매크로를 사용하는 것입니다. 먼저 반복해야 하는 작업을 수행한 다음 매크로를 사용하여 기록합니다. 매크로는 실제로 Visual Basic이며 PHP로 매우 쉽게 변환될 수도 있습니다.

가장 중요한 것은 Office PIA의 공식 Microsoft 문서, 특히 문서에 포함된 각 Office 애플리케이션의 네임스페이스가 항상 우리에게 필요한 가장 중요한 참고 자료가 된다는 것입니다. 가장 일반적으로 사용되는 세 가지 애플리케이션은 다음과 같습니다.

  • 엑셀 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
  • 워드 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
  • PowerPoint2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

결론

이 기사에서는 PHP COM 라이브러리와 Microsoft Office Interop 기능을 사용하여 Word 문서를 섀도우하는 방법을 보여줍니다.

Windows와 Office는 일상생활에서 널리 사용된다고 할 수 있습니다. Windows 플랫폼에서 PHP를 개발하는 프로그래머에게는 Office나 Windows 및 PHP의 강력한 기능을 알고 이해할 수 있는 능력이 매우 필요합니다.

PHP의 COM 확장을 사용하면 이 조합을 마스터할 수 있는 문이 열립니다.

프로그래밍의 이 부분에 관심이 있으신 경우 의견을 남겨주시면 이 주제에 대한 추가 기사 작성을 고려해 보겠습니다. 저는 이 접근 방식을 사용하여 더욱 실제적인 애플리케이션 개발을 기대하고 있습니다.

윈도우, PHP, 워드


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.