2012-09-11 27 views
14

Trong ứng dụng C# của tôi, với sự trợ giúp của tệp Excel Interop dll (làm tài liệu tham khảo), tôi đang đọc/ghi các tệp excel. Nếu tôi di chuyển chương trình này đến hệ thống nơi văn phòng/excel không được cài đặt (nghĩ về máy sạch), tôi đang đánh với lỗi dưới đây.Cách tạo một phiên bản Excel nếu Excel chưa được cài đặt

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Lỗi trên được mong đợi vì không có điểm nổi bật trên máy mục tiêu.
Câu hỏi của tôi là, có cách nào khác để sử dụng chương trình của tôi ngoài việc đăng ký Interop dll trên máy mục tiêu không?

Trả lời

15

My question is, is there any other way to use my program apart from registering Interop dll on target machine?

Bạn đang hỏi xem có cách nào để sử dụng chương trình, sử dụng Excel interop, khi Excel chưa được cài đặt trên máy tính đang chạy chương trình của bạn. Câu trả lời ngắn gọn là không. Câu trả lời dài hơn là có, nếu bạn sẵn sàng tái cấu trúc chương trình của bạn để không sử dụng interop.

Bạn có thể sử dụng OOXml SDK do Microsoft cung cấp nếu phiên bản Excel bạn đang nhắm mục tiêu là năm 2007 trở lên. Bạn cũng có thể sử dụng thư viện của bên thứ ba chẳng hạn như Aspose nếu bạn sẵn sàng chi một chút tiền.

Ví dụ về việc sử dụng SDK OOXml để chèn bảng tính vào tệp excel có thể tìm thấy tại msdn.

// Given a document name, inserts a new worksheet. 
public static void InsertWorksheet(string docName) 
{ 
    // Open the document for editing. 
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
    { 
     // Add a blank WorksheetPart. 
     WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>(); 
     newWorksheetPart.Worksheet = new Worksheet(new SheetData()); 

     Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>(); 
     string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart); 

     // Get a unique ID for the new worksheet. 
     uint sheetId = 1; 
     if (sheets.Elements<Sheet>().Count() > 0) 
     { 
      sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1; 
     } 

     // Give the new worksheet a name. 
     string sheetName = "Sheet" + sheetId; 

     // Append the new worksheet and associate it with the workbook. 
     Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName }; 
     sheets.Append(sheet); 
    } 
} 
+1

Cảm ơn các chi tiết. Tôi hiểu lý do để chuyển sang OpenXML, nhưng thật đáng buồn là tôi phải trở lại interop vì những lý do khác. Chỉ để giải quyết vấn đề, tôi đang cài đặt excel (như điều kiện tiên quyết) cho chương trình của tôi. – Mahender

0

Từ tất cả các nghiên cứu tôi đã làm một thời gian trước khi tôi cần phải tương tác với tệp Excel trên máy chủ, bạn phải cài đặt Office.

12

Thậm chí Microsoft does not recommends usein Interop libraries on a server. Vì vậy, tốt nhất để tìm một số khuôn khổ thay thế để làm Excel cho bạn. Tôi đã sử dụng thành công Npoi trong quá khứ cho mục đích đó.

Tôi biết đây không phải là câu trả lời cho ngoại lệ của bạn. Nhưng thành thật mà nói, Interop là một con đường dẫn đến một rắc rối vô tận và những thông điệp ngoại lệ bí ẩn.

Cập nhật 2017: Tôi chưa sử dụng NPOI một thời gian và chuyển tất cả dự án của mình sang thư viện OpenXML tạo ra các tệp xlsx hiện đại.

+3

+1 cho Npoi. Tôi đã thấy rằng đó là thư viện miễn phí tốt nhất để làm việc với các tài liệu Excel. Làm việc với cả hai .xls và xlsx. – burnttoast11

+2

+1 cho Npoi và "Interop là đường dẫn đến một sự cố vô tận và các thông báo ngoại lệ khó hiểu". Có nó thực sự đau. – NeverHopeless

Các vấn đề liên quan