2009-08-20 39 views
6

Tôi đang sử dụng Excel 2007. Tôi có mã C# được viết bằng một nhị phân riêng biệt. Mã này sử dụng các lớp tĩnh và các phương thức tĩnh trên các lớp. Tôi có một tham chiếu đến DLL trong dự án VSTO Excel Worksheet của tôi. Tôi phải thêm hoặc sửa đổi điều gì để làm việc này?Phương thức gọi được viết bằng C# trong Excel 2007 từ công thức ô

Mã của tôi C# trông như thế này:

using System; 
using System.Collections.Generic; 
using Microsoft.Office.Interop.Excel; 
using System.Runtime.InteropServices; 

namespace FooStatistics 
{ 
    [ComVisible(true)] 
    public static class Statistics 
    { 
     public static int Count(Range range) 
     { 
      return range.Count; 
     } 

Tôi muốn để có thể đặt một công thức vào một tế bào Excel mà trông như thế này:

=FooStatistic.Statistic.Count(A1:A10) 

Hoặc bất cứ điều gì.

Tôi đã xem this nhưng dường như là các lớp không tĩnh trong Excel 2003. Tôi không thể tin rằng tích hợp không tốt hơn bây giờ.

Tôi đã xem xét rất nhiều câu hỏi về StackOverflow về vấn đề này. Họ không xuất hiện để cung cấp tích hợp bản địa (nhiều người nói, "Sử dụng thư viện mã nguồn mở X") và, đáng ngại, nhiều người không được OP chấp nhận. Tôi không tìm kiếm, "Làm cho nó thành một đối tượng COM và gọi nó từ VBA."

Vì vậy, tôi đang tìm:

  • Excel 2007
  • mã trong C# DLL
  • cuộc gọi từ di động Excel như UDF
  • hội nhập có nguồn gốc

Vì vậy, đây là another StackOverflow link, trong đó hai người trả lời nói:

  • Theo như tôi biết, bạn không thể trực tiếp tạo UDF trong VSTO.
  • VSTO không hỗ trợ tạo Excel UDF. Tự động hóa Add-Ins có thể được tạo ra trong. Net, và dường như được Microsoft chấp thuận cách làm việc đó.

Đây là câu hỏi từ tháng 6 năm 2009. Đây có phải là sự thật - trong năm 2009, bạn phải trưng bày các thành phần .NET của bạn dưới dạng máy chủ COM để nhận UDFs có thể gọi cho Excel?

Trả lời

2

Nếu đây là bốn yêu cầu của bạn - (1) Excel 2007, (2) mã trong C# DLL, (3) gọi từ ô Excel dưới dạng UDF, (4) tích hợp gốc - thì, vâng, điều này có thể được thực hiện và khá dễ dàng. Một trong những hướng dẫn tốt nhất về cách làm điều này là bài viết của Eric Carter Writing user defined functions for Excel in .NET.

Nếu bạn muốn thêm mã của mình được lưu trữ qua VSTO, thì tôi gần như chắc chắn rằng bạn bắt buộc phải sử dụng trình bao bọc VBA trong trường hợp này. Xem bài viết của Paul Stubbs How to create Excel UDFs in VSTO managed code nơi ông sử dụng một bổ trợ VBA để trưng ra các UDF của VBA, mà lần lượt gọi các UDF được quản lý của mình được viết bằng VSTO.

Thành thật mà nói, đối với Excel UDF, tôi chỉ đơn giản là tránh sử dụng VSTO. VSTO là một nhà thiết kế tuyệt vời cho các add-in COM được quản lý, cho phép bạn dễ dàng thêm các điều khiển Ribbon và các loại tương tự. Nhưng nó không giúp ích gì cho UDF (và trên thực tế, thậm chí không hỗ trợ nó). Vì vậy, lời khuyên của tôi là tạo một bổ trợ tự động hóa được quản lý, theo số Eric Carter's article và thả yêu cầu VSTO.

Nếu bạn làm điều này, bạn sẽ không gặp vấn đề gì, tôi hứa.:-)

Mike

+0

Huh. Tôi đang trải qua tất cả các giai đoạn phát triển phần mềm: giận dữ, từ chối, thương lượng, trầm cảm và chấp nhận. – hughdbrown

+0

Vì vậy, khi tôi làm tất cả điều này, tôi nhận được một cảnh báo thời gian biên dịch "... không chứa bất kỳ loại có thể được đăng ký cho COM Interop." Tôi nghi ngờ điều này là bởi vì tôi đã sử dụng một lớp tĩnh với các phương thức tĩnh. Tôi có cần * để có một lớp học không tĩnh không? Hay cái gì khác? – hughdbrown

+0

Vì vậy, tôi có thể làm điều này để làm việc miễn là tôi không sử dụng các lớp tĩnh và các phương thức tĩnh. Tôi kết thúc với một đối tượng không có thật mà không có bất động sản hoặc phương pháp nhưng tôi có thể gọi. Thở dài. – hughdbrown

0

@ hughdbrown: chỉ cần làm theo ví dụ trong bài viết Erics. Nếu bạn làm điều đó nó sẽ làm việc. Không, bạn không thể sử dụng lớp tĩnh. của bạn instaniating một lớp .net với một wrapper COM (đăng ký nó cho com interop).

1

Hugh,

Tôi hiểu mong muốn của bạn về giải pháp 'bản địa', thay vì "Sử dụng thư viện nguồn mở X". Nhưng ngay cả VSTO không có vẻ rất 'bản địa' với Excel.

Yêu cầu của bạn chính xác là những gì khiến tôi phát triển ExcelDna (http://exceldna.codeplex.com) sau khi tìm kiếm trình bổ sung Tự động không đầy đủ. Hỗ trợ cho Tự động hóa Bổ trợ chưa được cải thiện trong các phiên bản Excel gần đây, trong khi API bổ trợ .xll (ExcelDna sử dụng) đã được hỗ trợ cập nhật trong các phiên bản gần đây, hiện đang hỗ trợ tính toán lại nhiều luồng và với các cuộc gọi không đồng bộ đến trong Excel 2010.

Mặc dù ExcelDna là một phần bổ sung để đưa vào giải pháp của bạn, bạn sẽ hài lòng với kết quả. Đáng buồn là không có hướng dẫn rõ ràng từ Microsoft về các trình bổ sung UDF được quản lý, hoặc bất kỳ dấu hiệu nào hỗ trợ cho VSTO, nhưng trong thực tế làm việc với ExcelDna rất dễ dàng, nhẹ và nó hoạt động rất tốt.

Chuyển đổi

+0

Tôi thích ExcelDNA từ cái nhìn ngắn gọn mà tôi đã có. Một vấn đề là khách hàng muốn bảo vệ nguồn của mình. Tôi không tưởng tượng đưa nguồn vào các tập tin .DNA cho tất cả để đọc sẽ được chấp nhận. – hughdbrown

+0

Có một chuỗi hội tụ tại đây: http://stackoverflow.com/questions/1363171/vb-net-com-server-code-way-slower-than-excel-vba-code. Nhận xét của tôi là: Mã nguồn UDF của bạn có thể nằm trong tệp văn bản .dna hoặc trong một tệp .dll được biên dịch bên ngoài. Hướng dẫn bắt đầu cho thấy cách tham chiếu thư viện bên ngoài. Nếu bạn muốn bảo mật mã của bạn, bạn có các vấn đề .NET obfuscation bình thường, và tôi sẽ giới thiệu ít nhất một cái gì đó như DotFuscator. Nhưng điều này không khác nhau giữa ExcelDna và các giải pháp .Net khác. – Govert

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