Excel 2007로 사무용 자동화를 시도하지만 Excel 2003을 계속 사용하고 있습니다.

StackOverflow https://stackoverflow.com/questions/2239472

문제

환경:

Windows XP 머신
Excel 2007과 Excel 2003은 모두 설치되었습니다 (순서대로 시간순으로 아님).
C# 3.5

문제:

PIAS를 사용하여 일부 사무실 자동화를 수행 할 때 다음과 같은 코드 라인을 사용합니다.

var excel = new ApplicationClass();

PIA의 버전은 특히 Excel 12라고합니다.
C : Windows Assembly Gac Microsoft.office.interop.excel 12.0.0.0__71e9bce111e9429c microsoft.office.interop.excel.dll
하지만:

 excel.Version;//this is 11.0 instead of 12.0

따라서 extention .xlsx가있는 파일을 열려고 할 때 파일 변환의 기능 손실에 대해 경고하고 Excel 2003으로 열립니다. 설치 주문이 2007-> 2003 인 것과 관련이 있다고 확신합니다. 그러나 내 컴퓨터 B/C에서 2003을 제거 할 수는 없습니다. 우리는 Excel 2003을 사용하는 관련없는 프로젝트를 위해 웹 서버에 사무용 자동화가 있습니다.

정책을 보았습니다 .11.0.microsoft.office.interop.excel.config stub.

<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>

그래서 나는 손실에있다. COM Interop에게 어떤 버전의 Excel을 사용할 수 있습니까?

도움이 되었습니까?

해결책

어떤 버전의 Excel을 사용할 것인지 프로그래밍 방식으로 명령 할 수는 없습니다. PIA는 개발중인 인터페이스 또는 객체 모델 만 지시합니다. 그러나 실제로 실행중인 버전의 Excel은 레지스트리에 의해 제어됩니다.

그러나 PIAS를 실행할 때는 실제로 시스템에 설치된 최고 수준의 PIA에 대해 실행됩니다. 따라서 Excel 2003 PIA를 상대로 개발하지만 클라이언트가 Excel 2007 PIA를 사용하여 Excel 2007을 보유하고 있다면 코드는 Excel 2007 PIA에 대해 실행됩니다. Excel 2007 PIA가 후진 호환되기 때문에 잘 실행됩니다. 즉, 각각의 상위 Numbered PIA 버전 (및 Excel 객체 모델)은 이전 PIA 및 구형 Excel 객체 모델에 대해 컴파일 된 명령과 호환됩니다. 클라이언트가 기계에 Excel 2007과 Excel 2003 Pias를 모두 가지고 있다면, 어느 버전의 Excel 버전에 관계없이 더 높은 버전의 PIA가로드 될 것입니다.

편집 : 한 가지 경고는 VB.NET 또는 C# 4.0을 사용할 때 Excel 2007 PIA가 100% 후진 호환되어야한다는 것입니다. C# 3.0 이하를 사용하는 경우 C# 3.0 이하에서 호출 할 때 선택적 매개 변수가 실제로 필요하다는 사실은 고등 VISIA 또는 객체 모델에 대해 실행할 때 일부 코드에서 중단됩니다. 그래도 비교적 드물고 C# 4.0을 사용하면이 문제가 이론적으로 사라질 것입니다.

좋아, 따라서 당신이 개발 한 PIA가 실제로 클라이언트 시스템에서 실제로 실행될 PIA를 실제로 제어하지 않기 때문에 PIA를 많이 제어 할 수 없습니다.

어떤 버전의 Excel이 출시 될지에 대한 제어가 많지 않습니다. 예를 들어, 다음을 통해 새 Excel 인스턴스를 만들 때

Excel.Application excelApp = new Application();

로드 된 Excel 응용 프로그램은 레지스트리에 설정된 현재 버전에 따라 설정됩니다. 현재 버전은 다음에 저장됩니다.

HKEY_CLASSES_ROOT\Excel.Application\CurVer

케이스의 '커버'키는 'excel.application.12'대신 'excel.application.11'의 기본값을 갖습니다. 이것을 혼자 변경하면 트릭을 수행 할 수 있지만 모든 레지스트리 설정이 올바르게 수정되도록 수리를 선호합니다. (그리고 나는 모든 설정이 무엇인지 알 수 없었습니다.) 좋아, 나는 방금 또 다른 설정을 찾았다 : 당신은 또한 변경해야 할 것입니다.

[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]

"Excel.application.12"의 값을 보유합니다. 그러나 대신 수리를 실행하는 것이 좋습니다. 다른 설정이 변경되어야하는지 모르겠으므로 손으로 변경하는 것은 약간 위험합니다.

또한 다음 키도 찾아야합니다.

HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12

이것들은 당신이 설치 한 Excel의 버전이기 때문입니다.

(보다 여기 추가 토론을 위해.)

설치 주문이 2007-> 2003 인 것과 관련이 있다고 확신합니다.

예, 이것은 100% 정확합니다. Excel 2007에서 수리를 시도 할 수 있습니다. 이것은 가장 쉬운 일입니다. 이것이 작동하지 않으면 둘 다 제거한 다음 둘 다 다시 설치합니다. Excel 2003을 제거한 다음 2007 년을 제거한 다음 (설치 한 순서를 뒤집어 놓음) Excel 2003을 설치 한 다음 Excel 2007을 설치하여 올바른 순서로 두 버전을 설치할 것입니다.

그러나이 작업을 수행함으로써 Excel 2007은 전화 할 때 기본적으로 실행됩니다. Excel.Application excelApp = new Application().

실제 권장 연습은 다음과 같습니다 ~ 아니다 개발자의 컴퓨터에서 두 버전의 Excel을 실행하도록합니다. 이에 대한 자세한 내용은 다음을 참조하십시오.

나는 동일한 개발 기계에 여러 버전의 Excel을 가지고 있었고, 개인적 으로이 기사가 소리를내는 것만 큼 복잡하지 않다고 생각했습니다. 일반적으로 Excel 2007 PIA는 Excel 2003 PIA와 호환되며 모든 것이 잘 작동합니다. 그러나 나는 한때 당신과 비슷한 레지스트리 혼란에 빠졌고 "옳은 일을하기로 결정했습니다. 나는 둘 다 제거한 다음 Excel 2007 만 다시 설치했습니다.

거기에서 무료 인 가상 PC를 설치했습니다 (VM Ware는 실제로 조금 더 좋지만 무료는 아닙니다). 그런 다음 2003, 2002, 2000 및 '97을 위해 더 낮은 버전의 Excel을 설치했습니다. 확실히 설정해야 할 작업이지만 일단이 작업을 수행하면 모든 것이 100% 깨끗합니다.

즉, 나는 아마도 실제로하고 싶지 않을 것입니다 개발하다 VM에서 Excel의 낮은 버전에 비해 VM 내에서 호스팅 된 Visual Studio를 사용하기가 너무 어려울 것입니다. 따라서 이러한 VM은 다양한 클라이언트 구성에 대해 시스템이 작동 할 수 있도록 배포 테스트에만 적합합니다. 이해가 되나요?

도움이 되었기를 바랍니다!

마이크

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top