C# ASP.NET中的Excel自动化

C# ASP.NET中的Excel自动化,c#,asp.net,.net,excel,C#,Asp.net,.net,Excel,我知道不建议采用这种方法,应该不惜一切代价避免。所以请不要回答我使用第三方图书馆或任何相关的东西 首先,系统创建一个文件并在其中写入html以显示数据。系统用.xls扩展名命名MS Excel,这是在愚弄它,即使它包含的是html 目标: 我需要把它转换成真正的XLS文件。所以我想用COM打开它,并将其保存为xls 问题: 现在发生的是,它抛出了一个异常,我不知道它来自哪里。在开发环境方面,它运行得非常好。但无论何时我们将其传输到服务器。问题出现了。我不能在服务器上调试(我知道我不能),但我想我

我知道不建议采用这种方法,应该不惜一切代价避免。所以请不要回答我使用第三方图书馆或任何相关的东西

首先,系统创建一个文件并在其中写入html以显示数据。系统用.xls扩展名命名MS Excel,这是在愚弄它,即使它包含的是html

目标: 我需要把它转换成真正的XLS文件。所以我想用COM打开它,并将其保存为xls

问题: 现在发生的是,它抛出了一个异常,我不知道它来自哪里。在开发环境方面,它运行得非常好。但无论何时我们将其传输到服务器。问题出现了。我不能在服务器上调试(我知道我不能),但我想我别无选择。下面是抛出的异常

“/”应用程序中出现服务器错误

来自HRESULT的异常:0x800A03EC

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:System.Runtime.InteropServices.COMException:来自HRESULT的异常:0x800A03EC

源错误:

在执行当前web请求期间生成了未经处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别

堆栈跟踪:

[COMException(0x800a03ec):来自HRESULT:0x800a03ec的异常。]

PLDTGlobal.Remco.ExcelCOM.SaveFileAsXLS(字符串文件路径、字符串文件名、字符串路径)

PLDTGlobal.Remco.otherfulfillments.BatchFiles.\uu InsertBDO.SaveRecord()

PLDTGlobal.Remco.otherfulfillments.BatchFiles.\uu InsertBDO.cmdSave\u单击(对象发送方,事件参数e)

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

System.Web.UI.WebControl.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

版本信息:Microsoft.NET Framework版本:1.1.4322.2032;ASP.NET版本:1.1.4322.2032

环境详情:

发展

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);
    }
}
public ExcelCOM()
{
尝试
{
excelApp=新的Excel.Application();
excelApp.Visible=true;
}
捕获(例外情况除外)
{
ErrorLogger=新的ErrorLogger();
logger.WriteErrorLog(例如Message,例如StackTrace);
掷骰子;
}
}
/// 
///使用Excel COM库打开xml文件,并将其转换为.xls(1997-2003)格式
/// 
///目标文件的完整文件路径
///目标的文件名
///保存.xls文件的新路径
public void SaveFileAsXLS(字符串文件路径、字符串文件名、字符串路径)
{
object missingParam=System.Reflection.Missing.Value;
字符串fileToCreate=path+fileName.Substring(0,fileName.Length-4);
尝试
{           
如果(!Directory.Exists(path))
{
CreateDirectory(路径);
}
excelApp.Visible=false;
Excel.Workbook工作簿=excelApp.Workbooks.Open(文件路径,0,false,5,“,”,false,Excel.XlPlatform.xlWindows,“,true,false,0,true,false,false);
Excel.Worksheet workSheet1=(Excel.Worksheet)workBook.Sheets.get_项(1);
工作表1.Name=“Sheet1”;
工作表1.SaveAs(fileToCreate,Excel.XlFileFormat.xlExcel9795,missingParam,missingParam,false,missingParam,missingParam,missingParam,missingParam,missingParam);
工作簿.关闭(missingpram,missingpram,missingpram);
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(工作表1);
Marshal.ReleaseComObject(工作簿);
}
捕获(例外情况除外)
{
ErrorLogger=新的ErrorLogger();
logger.WriteErrorLog(例如Message,例如StackTrace);
掷骰子;
}       
最后
{   
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
我已尝试向dcomcnfg中的网络服务帐户授予启动权限


非常感谢您对这个问题以及如何解决这个问题的任何想法。

我不确定这是否可行。我确实在我的服务器上运行了一个开发环境,以解决这类问题。我在Visual Studio 2013中编写了自动化Excel的代码,代码非常有效。当我将代码放入IIS 7(2012服务器)时,代码停止工作。根据我的研究,这是微软设计的,因为他们不希望你这样做。我不得不改变很多权限,使它甚至部分工作。最后,我无法让Excel显示,微软正式表示Excel将抛出错误,因为这是不受支持的。

我看不清楚代码,但这里有大量内存泄漏<代码>GC.Collect()等。。。最后应该在
。如果文件包含html,您希望它在xls中的外观如何?是否搜索错误代码
0x800A03EC
?@T.S.Excel有时能够从html中提取表格数据。我不知道为什么OP会选择两个有问题的东西(将HTML读取为XLS并在服务器上运行Excel)同时尝试-一次一个会更容易(在服务器上运行Excel不会得到神奇的支持,但一次一个坏主意可能很容易诊断)。然后我会说您必须做一些测试:首先将要在生产环境中创建的文件名(可能与Dev one不同)和RDP(如果可能)记录到生产环境中