【问题标题】:How to integrate COM Interop (manipulations of Excel, Ms Word, etc) in a web-API written in C#?如何在用 C# 编写的 web-API 中集成 COM 互操作(Excel、Ms Word 等的操作)?
【发布时间】:2019-10-04 13:57:18
【问题描述】:

我正在尝试将 COM 互操作集成到我用 C# 编写的 Web API 中。而且web api的.net核心好像不能支持COM技术。

这是我收到的错误消息:

FlicApi.Controllers.ButtonController.Post(string buttonId)
lambda_method(Closure , object , object[] )
Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(object target, object[] parameters)
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

有没有办法绕过net-core for web API不支持COM的情况?最终我想要实现的是调用一个 API 并在 Microsoft Excel 上进行一些操作。

这是我尝试过的:

        // POST api/button/buttonId
        [HttpPost("{buttonId}")]
        public ActionResult<string> Post(string buttonId)
        {
            //Console.WriteLine(value);

            //start Excel and get Application Object
            oXL = new Excel.Application();
            oXL.Visible = true;
            //Get a new workbook.
            oWB = oXL.Workbooks.Add(Missing.Value);
            oSheet = (Excel._Worksheet)oWB.ActiveSheet;

            //Add table headers going cell by cell.
            oSheet.Cells[1, 1] = "First Name";
            oSheet.Cells[1, 2] = "Last Name";
            oSheet.Cells[1, 3] = "Full Name";
            oSheet.Cells[1, 4] = "Salary";

            oWB.SaveCopyAs(@"/Users/eaxz/Desktop/book1.xlsx");

            return "success";


        }

【问题讨论】:

  • 由于不支持在无头环境中运行 Office 应用程序,您最好使用其他一些库来实现您的目标...(这也将消除使用 COM 互操作的需要)
  • @AlexeiLevenkov 还有其他图书馆推荐吗?看来 COM 是 C# 的必经之路......
  • 要走的路是不要在作为 IIS 的 Web 服务器上运行的任何东西中使用任何办公应用程序,或者在没有“桌面”的每个无人值守环境中使用任何办公应用程序。 HereMicrosoft 解释了原因。对于 Excel,我发现 NPOI 非常强大且易于使用(比使用 Excel 提供的 Office 对象模型容易得多)。这是针对 Java 的开源 Apache POI 的 .Net 移植。
  • “ClosedXml”也是一个很好的Excel文件读写包。
  • It seems COM is the way to go for c# though以前从未听说过!

标签: c# .net excel api com-interop


【解决方案1】:

COM 互操作不是服务器端环境的好选择。您可以尝试一些第三方组件,例如GrapeCiy Document API

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2020-02-10
    • 2012-03-27
    相关资源
    最近更新 更多