Excel 2007으로 Office Automation을 하려고 하지만 Excel 2003을 계속 사용합니다.
환경:
윈도 XP 시스템
Excel 2007 및 Excel 2003이 모두 설치되었습니다(시간순이 아닌 순서대로).
C# 3.5
문제:
PIA를 사용하여 Office 자동화를 수행할 때 다음 코드 줄을 사용합니다.
var excel = new ApplicationClass();
PIA의 버전은 Excel 12로 명시되어 있습니다.
C:\WINDOWS\assembly\GAC\Microsoft.사무실.인터럽트.Excel\12.0.0__71e9bce111e9429c\Microsoft.사무실.인터럽트.Excel.dll
그러나:
excel.Version;//this is 11.0 instead of 12.0
따라서 확장자가 .xlsx인 파일을 열려고 하면 파일 변환 기능이 손실되었음을 경고하고 excel 2003으로 엽니다.저는 그것이 2007 -> 2003년의 설치 순서와 관련이 있다고 꽤 확신하지만, 제 컴퓨터에서 2003년을 제거할 수 없습니다. 우리는 엑셀 2003을 사용하는 관련 없는 프로젝트를 위해 웹 서버에 사무실 자동화가 있습니다.
Policy.11.0을 살펴봤습니다.마이크로소프트.사무실.인터럽트.Excel.config 내용이지만 다음과 같이 표시됩니다.
<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>
그래서 저는 막막합니다.COM Interop에 사용할 Excel 버전을 알려줄 수 없는 이유는 무엇입니까?
사용할 Excel 버전을 프로그래밍 방식으로 명령할 수 없습니다.PIA는 개발 중인 인터페이스 또는 개체 모델만 지정합니다.그러나 실제로 실행 중인 Excel 버전은 레지스트리에 의해 제어됩니다.
그러나 PIA를 실행할 때는 실제로 시스템에 설치된 가장 높은 수준의 PIA를 실행해야 합니다.따라서 Excel 2003 PIA에 대해 개발한 경우 클라이언트에 Excel 2007 PIA가 포함된 Excel 2007을 사용하면 코드가 Excel 2007 PIA에 대해 실행됩니다. Excel 2007 PIA는 하위 호환성이 있기 때문에 정상적으로 실행됩니다.즉, 각 상위 PIA 버전(및 Excel 개체 모델)은 이전 PIA 및 이전 Excel 개체 모델에 대해 컴파일된 명령과 역호환됩니다.클라이언트가 컴퓨터에 Excel 2007 및 Excel 2003 PIA를 모두 가지고 있으면 실행 중인 Excel 버전에 관계없이 상위 버전의 PIA가 로드되므로 두 PIA를 모두 사용할 수 있는 경우 Excel 2007 PIA가 실행됩니다.
[편집: 한 가지 주의할 점은 VB를 사용할 때 Excel 2007 PIA가 100% 이전 버전과 호환되어야 한다는 것입니다.NET 또는 C# 4.0.C# 3.0 이하를 사용하는 경우 C# 3.0 이하에서 호출할 때 실제로 선택적 매개 변수가 필요하다는 사실은 상위 버전의 PIA 또는 객체 모델에 대해 실행할 때 일부 코드에 중단을 발생시킵니다.그러나 비교적 드문 일이며 C# 4.0에서는 이론적으로 이 문제가 사라져야 합니다.]
좋아요. PIA에 대해 개발한 PIA는 실제로 클라이언트 시스템에서 실행될 PIA를 제어하지 않기 때문에 PIA를 제어할 수 없습니다.
당신은 또한 어떤 버전의 엑셀이 출시되는지에 대해 많은 통제력을 가지고 있지 않습니다.예를 들어 다음을 통해 새 Excel 인스턴스를 생성하는 경우:
Excel.Application excelApp = new Application();
로드된 Excel 응용 프로그램은 레지스트리에 설정된 현재 버전에 따라 설정됩니다.현재 버전은 다음 위치에 저장됩니다.
HKEY_CLASSES_ROOT\Excel.Application\CurVer
이 경우 'CurVer' 키의 기본값은 'Excel'인 것 같습니다.'Excel' 대신 'application.11'.지원서.12'.이것만 변경해도 효과가 있을 수 있지만, 모든 레지스트리 설정이 제대로 수정되었는지 확인하기 위해 수리를 하는 것이 더 좋습니다. (그리고 모든 설정이 어떻게 되어야 하는지는 도저히 알 수 없었습니다.)네, 방금 다른 것을 찾았습니다. 당신도 변경해야 합니다.
[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]
"Excel"의 값을 보유합니다.신청서.12".대신 수리를 실행하는 것이 좋습니다.다른 설정을 변경해야 할 경우 어떤 설정을 변경해야 할지 모르기 때문에 수동으로 변경하는 것은 약간 위험합니다.
또한 다음 키도 찾아야 합니다.
HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12
이것들이 당신이 설치한 엑셀 버전이기 때문입니다.
(자세한 내용은 여기를 참조하십시오.)
설치 순서가 2007 -> 2003인 것과 관련이 있다고 꽤 확신합니다.
네, 이것은 100% 맞습니다.Excel 2007에서 복구를 실행해 볼 수도 있습니다. 이것이 가장 쉬운 방법일 것입니다.그래도 안 되면 둘 다 제거하고 다시 설치합니다.Excel 2003을 제거한 다음 2007을 제거하고(설치한 순서를 반대로) Excel 2003을 설치한 다음 Excel 2007을 설치하여 두 버전을 올바른 순서로 설치합니다.
이렇게 Excel 2007을 할 때 됩니다.Excel.Application excelApp = new Application()
.
실제 권장 사례는 개발자의 컴퓨터에서 두 버전의 Excel을 모두 실행하지 않는 것입니다.자세한 내용은 다음을 참조하십시오.
- 여러 버전의 Office에서 VS 개발이 지원되지 않는 이유는 무엇입니까?
- 여러 버전의 Office에 대해 하나의 추가 기능을 구축할 수 있습니까?
- 여러 Office 버전에 대한 자동화 클라이언트 작성
저는 같은 개발 기계에 여러 버전의 Excel을 가지고 있었는데, 개인적으로 단점이 이 기사들이 말하는 것만큼 복잡하지 않다고 느꼈습니다.일반적으로 Excel 2007 PIA는 Excel 2003 PIA와 하위 호환되며 모든 것이 정상적으로 작동합니다.하지만 저는 한때 당신과 비슷한 레지스트리 혼란에 빠졌고 "옳은 일을 하기"로 결심했습니다.둘 다 제거하고 Excel 2007만 다시 설치했습니다.
여기서 Virtual PC를 설치했는데, 이는 무료입니다(VMware가 실제로는 조금 더 낫지만 무료는 아닙니다). 그런 다음 2003, 2002, 2000 및 '97용 하위 버전의 Excel을 별도의 VM에 설치했습니다. 확실히 설정해야 할 작업이지만, 이렇게 하면 모든 것이 100% 깨끗해집니다.
즉, VM에서 낮은 버전의 Excel과 비교하여 실제로 개발하고 싶지는 않을 것입니다. VM 내에서 호스팅되는 Visual Studio를 사용하는 것은 너무 어려울 것입니다.따라서 이러한 VM은 시스템이 다양한 클라이언트 구성에서 작동할 수 있는지 확인하기 위해 구축 테스트에만 적합합니다.이해했어?
이것이 도움이 되길 바랍니다!
마이크
언급URL : https://stackoverflow.com/questions/2239472/trying-to-do-office-automation-with-excel-2007-but-keeps-using-excel-2003
'code' 카테고리의 다른 글
powershell - 로컬 사용자 및 해당 그룹 나열 (0) | 2023.09.05 |
---|---|
Json 데이터 유형이 mariadb에서 작동하지 않습니다. (0) | 2023.09.05 |
appendChild에서 추가한 원하지 않는(빈) xmlns 특성 제거 (0) | 2023.09.05 |
도커 엔트리 포인트와 쿠버네티스 컨테이너 사양 명령의 차이점은 무엇입니까? (0) | 2023.09.05 |
왜 tqdm 인쇄가 같은 라인을 업데이트하는 대신 새로운 라인으로 진행됩니까? (0) | 2023.09.05 |