แอป C # ที่ใช้ Excel Interop สลับระหว่างปี 2546 2550 ได้อย่างง่ายดายหรือไม่

ฉันมีแอปที่เขียนว่าทำ I/O พื้นฐานจริงๆ บนสเปรดชีต อ่านในเซลล์จำนวนมาก ทำการเรียงลำดับ และถ่ายโอนข้อมูลเอาต์พุตกลับไปยังสเปรดชีตอื่น ใช้งานได้ดีกับเครื่องของฉัน ฉันติดตั้ง Office 2003 แล้ว

เมื่อมันทำงานบนเครื่องอื่นในปี 2550 มันจะระเบิด สันนิษฐานว่าเป็นเพราะชุดประกอบ Interop เวอร์ชันที่แตกต่างกัน

ฉันหวังว่าจะมีคนรู้วิธีเปลี่ยนแบบไดนามิกว่าจะโหลดแอสเซมบลีใด / ที่ไหนขึ้นอยู่กับเวอร์ชันของ office (การรับเวอร์ชัน office นั้นง่ายจากรีจิสตรี)

เมื่อค้นดูส่วนที่เหลือในอินเทอร์เน็ต ฉันไม่เห็นสิ่งใดที่บ่งชี้ว่าเป็นไปได้ :( ฉันพยายามติดตั้ง PIA ปี 2007 แต่เมื่อฉันพยายามเพิ่มข้อมูลอ้างอิง PIA เหล่านั้นไม่ปรากฏขึ้นและฉันไม่รู้ว่าจะค้นหาได้จากที่ไหน (ไม่ได้อยู่ใน c:\windows\assemblies\; บางทีการติดตั้งอาจไม่ทำงาน) ฉันจะต้องติดตั้งเครื่องรุ่น 2007 เพื่อสร้างทุกครั้งที่ต้องทำการอัปเดตหรือไม่


person user320781    schedule 27.05.2010    source แหล่งที่มา
comment
ระเบิดไม่ได้ช่วยให้เราช่วยคุณได้ ข้อความแสดงข้อผิดพลาดได้รับการออกแบบเพื่อวินิจฉัยปัญหา อย่าละเลยเพราะคุณไม่เข้าใจพวกเขา ใครบางคนที่นี่จะเข้าใจแน่นอน   -  person Hans Passant    schedule 28.05.2010


คำตอบ (2)


ดูโครงการของฉัน MS Office for .NET

เป็นชุดของแอสเซมบลีที่ได้รับการจัดการซึ่งมีประเภท wrapper ที่เขียนใน VB.NET โดยใช้อ็อบเจ็กต์ COM ที่มีผลผูกพันล่าช้าและโหลดแบบไดนามิก ใช้ได้กับเวอร์ชัน 97-2007 ไม่จำเป็นต้องมี PIA

ฉันเก็บโมเดลออบเจ็กต์ไว้ ดังนั้นตัวอย่าง VSTO ส่วนใหญ่ควรใช้งานได้โดยมีการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น

ฉันหวังว่ามันจะช่วยได้

person TcKs    schedule 27.05.2010
comment
แม้ว่าไลบรารีอาจจะดีแต่ขาดเอกสารประกอบและมีตัวอย่างเพียงไม่กี่ตัวอย่างและขาดความช่วยเหลือเช่นวิธีเปิดไฟล์ที่ป้องกันด้วยรหัสผ่าน...จะต้องขุดในซอร์สโค้ดเพื่อค้นหา - person RohitWagh; 31.01.2013

จริงๆ แล้วมีแนวโน้มมากกว่าที่เวอร์ชันรันไทม์ที่แสดงถึงปัญหาความเข้ากันได้ ไม่ใช่ PIA

เมื่อมันทำงานบนเครื่องอื่นในปี 2550 มันจะระเบิด สันนิษฐานว่าเป็นเพราะชุดประกอบ Interop เวอร์ชันที่แตกต่างกัน

ฉันรู้ว่ามันอาจจะ "รู้สึก" แบบนี้ แต่สถานการณ์นี้ไม่น่าเป็นไปได้ PIA ของ Excel 2007 นั้นกว้างกว่า PIA ปี 2003 ไม่ใช่แคบกว่า อาจมีการเพิ่มประเภท สมาชิก และพารามิเตอร์เผื่อเลือก แต่ลายเซ็นเก่าปี 2003 จะไม่เปลี่ยนแปลง ดังนั้น การโทรปี 2003 เก่าทั้งหมดของคุณจะทำงานในลักษณะเดียวกัน ไม่ว่าจะดำเนินการผ่าน PIA ปี 2003 หรือ PIA ปี 2007 แน่นอนว่านี่ไม่ใช่การรับประกัน 100.00% แต่ฉันเดาว่าน่าจะอยู่ที่ประมาณ 99.8%

ฉันหวังว่าจะมีคนรู้วิธีเปลี่ยนแบบไดนามิกว่าจะโหลดแอสเซมบลีใด / ที่ไหนขึ้นอยู่กับเวอร์ชันของ office (การรับเวอร์ชัน office นั้นง่ายจากรีจิสตรี)

คุณจะต้องใช้การสะท้อนกลับ เช่น Assembly วิธีการ LoadFrom แต่ฉันไม่คิดว่าคุณจะต้องไปเส้นทางนี้จริงๆ ในความเป็นจริง เพื่อพิสูจน์ คุณควรเปลี่ยนการอ้างอิงในแอสเซมบลีของคุณเป็นเวอร์ชัน 2007 คอมไพล์แล้วจึงรัน ฉันยินดีที่จะเดิมพันว่าคุณจะได้รับข้อผิดพลาดเดียวกันทุกประการ

แต่ทำไมถึงเป็นเช่นนี้? และคุณจะแก้ไขมันอย่างไร?

ปัญหาความเข้ากันได้ระหว่างโมเดลออบเจ็กต์ Excel 2003 และ Excel 2007 มีน้อย แต่ก็มีอยู่บ้าง ตัวอย่างหนึ่งคือคุณสมบัติ Range.Cells.Count ซึ่งส่งคืน Int32 ที่มีค่าสูงสุด +4.3 bil (ประมาณ) อย่างไรก็ตาม เนื่องจากแผ่นงานมีขนาดใหญ่กว่ามากใน Excel 2007 จำนวนเซลล์ในสเปรดชีตจึงอยู่ที่ประมาณ 17.2 พันล้านเซลล์ ดังนั้น Range.Cells.Count จะแสดงข้อยกเว้นหากช่วงมีขนาดใหญ่เกินไป (เช่น ประกอบด้วยแผ่นงานทั้งหมด) แต่คุณต้องเรียก Range.Cells.CountLarge แทน ซึ่งเนื่องจากส่งคืน Int64 จึงสามารถจัดการกับผลลัพธ์ที่ใหญ่กว่าได้

ดังนั้นจึงเป็นไปได้มากว่าเวอร์ชันรันไทม์ที่แสดงถึงปัญหาความเข้ากันได้ ไม่ใช่ PIA ดังนั้น คุณควรแยกบรรทัดที่ส่งข้อยกเว้น และแจ้งให้เราทราบว่าข้อความแสดงข้อผิดพลาดคืออะไร แล้วบางทีเราอาจช่วยได้...

-- ไมค์

person Mike Rosenblum    schedule 27.05.2010