Веб-приложение .Net не может генерировать книгу Excel один раз на сервере, отлично работает на локальном - PullRequest
0 голосов
/ 13 ноября 2018

Я просто создаю книгу Excel с базовым приложением Microsoft.Office.Interop.Excel

Вот способ ссылки на библиотеку в моем проекте:

Копировать локально: False
Типы встроенных взаимодействий: True
Путь: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Инструменты Visual Studio для Office \ PIA \ Office14 \ Microsoft.Office.Interop.Excel.dll
Рабочая версия: V2.0.50727
Версия: 14.0.0..0

Вот мой метод:

public ActionResult ExportToExcel()
{
ViewBag.CurrentUser = getCurrentUser();
var projects = (from u in getDB().ProjectsSet
             select u).ToList();
// Load Excel application
Application excel = new Application();
// Create empty workbook
excel.Workbooks.Add();

//Workbook wb = new Workbook();

// Create Worksheet from active sheet
_Worksheet workSheet = excel.ActiveSheet;
// I created Application and Worksheet objects before try/catch,
// so that i can close them in finnaly block.
// It’s IMPORTANT to release these COM objects!!
try
{
    // ————————————————
    // Creation of header cells
    // ————————————————
    workSheet.Cells[1, "A"] = "Id";
    workSheet.Cells[1, "B"] = "Name";
    workSheet.Cells[1, "C"] = "Fast Track";

    // ————————————————
    // Populate sheet with some real data from ” Studentts” list
    // ————————————————
    int row = 2; // start row (in row 1 are header cells)
    foreach (Projects projet in projects)
    {
        workSheet.Cells[row, "A"] = projet.Id;
        workSheet.Cells[row, "B"] = projet.Name;
        workSheet.Cells[row, "C"] = projet.FastTrack;
        row++;
    }
    // Apply some predefined styles for data to look nicely ??
    workSheet.Range["A1"].AutoFormat(Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic1);
    //Autofit cells
    for(int y = 1; y == 25; y++)
    {
        workSheet.Columns[y].AutoFit();
    }
    // Define filename
    string test = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    string fileName = string.Format(@"{0}\ProjectsExport_as_of_" + DateTime.Now.ToShortDateString() + ".xlsx", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
    // Save this data as a filestring fileName = "C:\\ProjectsExport_as_of_"+DateTime.Now.ToShortDateString()+".xlsx";
    workSheet.SaveAs(fileName);

    return File(fileName, "application/vnd.ms-excel", "ProjectsExport_as_of_" + DateTime.Now.ToShortDateString() + ".xlsx");

}
catch (Exception exception)
{
    Console.Write(exception.InnerException);
    return null;
}
finally
{
    // Quit Excel application
    excel.Quit();
    // Release COM objects (very important!)
    if (excel != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
    if (workSheet != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
    // Empty variables
    excel = null;
    workSheet = null;
    // Force garbage collector cleaning
    GC.Collect();
}

На сервере я установил Microsoft Office 2010 (так же, как мой локальный компьютер), и все библиотеки находятся в папке «C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Инструменты Visual Studio для Office \ PIA \ Office14». «как и ожидалось

Но я все еще получаю эту ошибку:

<!DOCTYPE html>

    
        Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
        
        
         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} 
         p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
         pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}
         .marker {font-weight: bold; color: black;text-decoration: none;}
         .version {color: gray;}
         .error {margin-bottom: 10px;}
         .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
         @media screen and (max-width: 639px) {
          pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
         }
         @media screen and (max-width: 479px) {
          pre { width: 280px; }
         }
        
    

    

            Server Error in '/' Application.

             Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). 

            

 Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

            

Exception Details: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:

[COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).] System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType) +0 System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType) +79 System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj) +88 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +119 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 System.Activator.CreateInstance(Type type, Boolean nonPublic) +83 System.Activator.CreateInstance(Type type) +11 SmartProductPMD.Controllers.ProjectsController.ExportToExcel() +2257 lambda_method(Closure , ControllerBase , Object[] ) +62 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +157 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22 System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50 System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +228 System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26 System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100 System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13 System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36 System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12 System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9873685 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +159


Информация о версии: Microsoft .NET Framework Версия: 4.0.30319; ASP.NET версия: 4.7.3163.0 <! - [COMException]: получение фабрики классов COM для компонента с CLSID {00024500-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80080005 Ошибка выполнения сервера (исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). в System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject (RuntimeType objectType) в System.Runtime.Remoting.Activation.ActivationServices.CreateInstance (RuntimeType serverType) в System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK (RuntimeType serverType, Object [] props, Boolean bNewObj) at System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, логический publicOnly, логический noCheck, логический & canBeCached, RuntimeMethodHandleInternal & ctor, логический & bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow (логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMark & ​​stackMark) at System.RuntimeType.CreateInstanceDefaultCtor (логический publicOnly, логический skipCheckThis, логический fillCache, StackCrawlMark & ​​stackMark) в System.Activator.CreateInstance (тип Type, логическое значение nonPublic) в System.Activator.CreateInstance (Тип тип) в SmartProductPMD.Controllers.ProjectsController.ExportToExcel () at lambda_method (Closure, ControllerBase, Object []) в System.Web.Mvc.ActionMethodDispatcher.Execute (контроллер ControllerBase, параметры Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary`2 параметры) в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, параметры IDictionary`2) в System.Web.Mvc.Async.AsyncControllerActionInvoker. <BeginInvokeSynchronousActionMethod>b__39 (IAsyncResult asyncResult, ActionInvocation innerInvokeState) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End () в System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters. b__3d () в System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters. <> c__DisplayClass46. b__3f () в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass33. b__32 (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End () в System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters (IAsyncResult asyncResult)в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass21. <> c__DisplayClass2b. b__1c () в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClasss1 .36)..Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End.InAccess.Inc.asyncResult) в System.Web.Mvc.Controller. b__1d (IAsyncResult asyncResult, ExecuteCoreState innerState) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDeynesS..AsyncResultWrapper.WrappedAsyncResultBase`1.End () в System.Web.Mvc.Controller.EndExecuteCore (IAsyncResult asyncResult) в System.Web.Mvc.Controller. b__15 (контроллер IAsyncResult.Wync)..Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End () в System.Web.Mvc.Controller.EndExecute (IAsyncResult asyncResult) в System.Webler.S.Mvc.Async.IAsyncController.EndExecute (IAsyncResult asyncResult) в System.Web.Mvc.MvcHandler. b__5 (IAsyncResult asyncResult, ProcessRequestState innerState) в System.Web.Mvc.Asesese) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End () в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mestc.MvcHandynEHHtlerSHРезультат IAsyncResult) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStepImpl (шаг IExecutionStep, ExteepStewnSteepStewnStep)->

Любая помощь приветствуется, я немного потерян, и если что-то еще понадобится, не стесняйтесь, я предоставлю вам все детали!

1 Ответ

0 голосов
/ 13 ноября 2018

https://support.microsoft.com/en-us/help/257757/considerations-for-server-side-automation-of-office

Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых необслуживаемых неинтерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может работать нестабильно. поведение и / или тупик при работе Office в этой среде.

Это хороший способ сказать, что вы не можете / не должны пытаться автоматизировать Excel на сервере. Все виды вещей могут пойти не так.

  • Excel Interop, как известно, оставляет запущенные экземпляры Excel, если вы не выпускайте осторожно каждый созданный вами объект. (Это на самом деле одна хорошая причина, чтобы не использовать его в любом месте, если не ваша жизнь зависит от этого.)
  • Excel сообщает об ошибках и других случайных вещах используя всплывающие окна. Если что-то всплывает в невидимом экземпляре Excel работает на сервере, никто не может знать или отвечать. Это не только потерпит неудачу, но и потеряет способность, которую невозможно диагностировать.

Я не могу подчеркнуть значение перехода на библиотеку, подобную EPPlus . В этом случае это необходимость.

Вместо того, чтобы писать код для автоматизации другого приложения для работы с файлом Excel, вы взаимодействуете непосредственно с файлом. Вы можете открывать файлы, читать их, изменять их и даже создавать совершенно новые с нуля или из шаблонов. Вы можете транслировать затем на веб-клиентов. Это круто Пожалуйста, поверьте мне, это сделает вашу жизнь лучше.

...