2014-02-03 3 views
0

Я знаю, что этот подход не рекомендуется и его следует избегать любой ценой. Поэтому, пожалуйста, не отвечайте мне на использование сторонней библиотеки или связанной с ней вещи.Автоматизация Excel в ASP.NET

Сначала система создает файл и записывает html внутри него для отображения данных. Система обманывает MS Excel, называя его расширением .xls, хотя в нем содержится html.

Цель: Мне нужно преобразовать его в файл REAL XLS. Поэтому я хочу открыть его с помощью COM и сохранить его как xls.

Проблема: Теперь случается так, что он дает исключение, которое я не знаю, откуда оно. В среде разработки он работает очень хорошо. но всякий раз, когда мы передаем его на сервер. Проблема возникает. Я не могу отлаживать сервер (я знаю, что не должен), но я думаю, что у меня нет другого выбора. Вот исключение брошено

Server Error in '/' Application.

Exception from HRESULT: 0x800A03EC.

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: Exception from HRESULT: 0x800A03EC.

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 (0x800a03ec): Exception from HRESULT: 0x800A03EC.]

PLDTGlobal.Remco.ExcelCOM.SaveFileAsXLS(String filePath, String fileName, String path)

PLDTGlobal.Remco.OtherFulfilments.BatchFiles.__InsertBDO.SaveRecord()

PLDTGlobal.Remco.OtherFulfilments.BatchFiles.__InsertBDO.cmdSave_Click(Object sender, EventArgs e)

System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108

System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57

System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18

System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33

System.Web.UI.Page.ProcessRequestMain() +1292

Version Information: Microsoft .NET Framework Version:1.1.4322.2032; ASP.NET Version:1.1.4322.2032.

Окружающая среда Детали:

DEV

Windows XP Professional SP3, Visual Studio 2003, .NET 1.1, MS EXCEL 11,0 Библиотека объектов

сервера

Windows Server 2008 R2 (x64)

Вот отрывок кода:

public ExcelCOM() 
{ 
    try 
    { 
     excelApp = new Excel.Application(); 
     excelApp.Visible = true; 
    } 
    catch(Exception ex) 
    { 
     ErrorLogger logger = new ErrorLogger(); 
     logger.WriteErrorLog(ex.Message, ex.StackTrace); 
     throw ex; 
    } 
} 


/// <summary> 
/// Opens the xml file using Excel COM library and converts it to .xls(1997-2003) format 
/// </summary> 
/// <param name="filePath">complete file path from target file</param> 
/// <param name="fileName">filename of the target</param> 
/// <param name="path">new path where to save the .xls</param> 
public void SaveFileAsXLS(string filePath, string fileName, string path) 
{ 
    object missingParam = System.Reflection.Missing.Value; 
    string fileToCreate = path + fileName.Substring(0, fileName.Length - 4);   

    try 
    {   
     if(!Directory.Exists(path)) 
     { 
      Directory.CreateDirectory(path); 
     } 
     excelApp.Visible = false; 
     Excel.Workbook workBook = excelApp.Workbooks.Open(filePath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); 
     Excel.Worksheet workSheet1 = (Excel.Worksheet) workBook.Sheets.get_Item(1); 
     workSheet1.Name = "Sheet1"; 
     workSheet1.SaveAs(fileToCreate, Excel.XlFileFormat.xlExcel9795, missingParam, missingParam, false, missingParam, missingParam, missingParam, missingParam, missingParam); 
     workBook.Close(missingParam, missingParam, missingParam); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     Marshal.ReleaseComObject(workSheet1); 
     Marshal.ReleaseComObject(workBook); 

    } 
    catch(Exception ex) 
    { 
     ErrorLogger logger = new ErrorLogger(); 
     logger.WriteErrorLog(ex.Message, ex.StackTrace); 
     throw ex; 
    }  
    finally 
    { 
     excelApp.Quit(); 
     Marshal.ReleaseComObject(excelApp); 
    } 
} 

Я попытался дать разрешение запуска для учетной записи сетевой службы в DCOMCNFG.

Любое представление о проблеме и о том, как ее решить, очень ценится.

+0

Я не уверен, глядя на код, но здесь есть тонкие утечки памяти. 'GC.Collect();' etc ... должен находиться в 'finally'. – rhughes

+1

Если файл содержит html, как вы ожидаете, что он будет выглядеть в xls? –

+2

Вы искали код ошибки '0x800A03EC'? –

ответ

0

Я не уверен, что это сработает. Я запускаю среду разработки на своем сервере, только для таких проблем. Я написал код для автоматизации Excel в Visual Studio 2013, код отлично работает. Когда я помещаю код в IIS 7 (сервер 2012 г.), код перестает работать. Из моих исследований это по дизайну Microsoft, потому что они не хотят, чтобы вы это делали. Мне пришлось изменить много разрешений, чтобы заставить его частично работать. В конце концов, я не могу заставить Excel отображать и официально, Microsoft говорит, что Excel будет генерировать ошибки, потому что это не поддерживается.

Смежные вопросы