为什么在VS里开发和运行的时候导出excel操作都是正常的,部署到IIS就不能导出了?

时间:2022-09-29 13:51:30
这是一个查询数据库并导出到excel文件的代码,为什么在VS2008里调试的时候一切都正常,只要部署到IIS上就无法导出。点了点出按钮后一闪一下就完了。
那位帮忙解释下?

DownExcel.aspx.cs
    #region 导出Excel文件开始
    // 导出Excel文件
    protected void btnExportExcel_Click(object sender, EventArgs e)
    {
        //得到需要导入Excel的DataTable
       // string mfilepath = Server.MapPath("./") + "DownFile/TranSport.xls";
        string SearchDate = Request["SearchD"].Trim().ToString();
        StringBuilder strSql = new StringBuilder();
        GridView myGridView = new GridView();
        DataTable dt;
        try
        {
            //--------------------------------------------------------------
            strSql.Append("SELECT [BUKRS],convert(char(6),[BUDAT],112) as BUDAT_T,[DELIVERY_CLS],[BEZEI],[VTEXT],[BEZEI2],SUM([LFIMG]) as SUMLFIMG,[VRKME],SUM([NETWR]) as SUMBUKRS, 0 as lilun ,[WAERS]");
            strSql.Append(" FROM MM.TranSport ");
            strSql.Append(" WHERE [BUKRS]='8200' and convert(char(6),[BUDAT],112)='" + SearchDate + "' ");
            strSql.Append(" GROUP BY ");
            strSql.Append(" [DELIVERY_CLS],[BEZEI],[VTEXT],[BEZEI2],[WAERS],[VRKME],[BUKRS],convert(char(6),[BUDAT],112) ");
            DataSet ds = new DataSet();
            ds = help.getdata(strSql.ToString(), "tab");
            //DataTable dt = LoadDataTable();
            dt = ds.Tables[0];
            myGridView.DataSource = dt;
            // 绑定数据
            //myGridView.DataBind();
            dt.Columns["BUKRS"].ColumnName = "公司代码";
            dt.Columns["BUDAT_T"].ColumnName = "结算月份";
            dt.Columns["DELIVERY_CLS"].ColumnName = "成品发运类型";
            dt.Columns["BEZEI"].ColumnName = "省市车站描述";
            dt.Columns["VTEXT"].ColumnName = "运输方式描述";
            dt.Columns["BEZEI2"].ColumnName = "装运类型的描述";
            dt.Columns["SUMLFIMG"].ColumnName = "实际已交货量总和(按销售单位)";
            dt.Columns["WAERS"].ColumnName = "货币代码";
            dt.Columns["SUMBUKRS"].ColumnName = "发运成本条目的货币中的净值";
            dt.Columns["VRKME"].ColumnName = "销售单位";
            dt.Columns["lilun"].ColumnName = "理论价格";
            myaction.SaveAsExcel(dt);  //输出内容到excel对象,数据源DataTable 实例必须为dt
        }
        catch (System.Exception ex)
        {
            Response.Write( "查询数据库时发生错误!错误信息:" + ex.Message + "<br>可能是因为数据库连接出现问题!请联系系统管理员!<br>");
           // return;
        }
    }
    // 导出Excel文件必须要下面这个,据说是vs2005的BUG,日
    #endregion 导出EXCEL文件结束


MyAction.cs
public class MyAction
{
public MyAction()
{
//
// TODO: Add constructor logic here
//
}
    public void SaveAsExcel(DataTable dt)
    {
        Microsoft.Office.Interop.Excel.Application excelKccx = new Microsoft.Office.Interop.Excel.Application();//创建excel对象
        excelKccx.Workbooks.Add(true);//创建excel工作薄
        //excelKccx.
        //DataTable myDataTable=myDataSet.Tables["库存信息"];//创建一个数据表,得到DataSet中“库存信息”表中的数据
        int row = 2;
        //把数据表的各个信息输入到excel表中
        for (int i = 0; i < dt.Columns.Count; i++)//取字段名
        {
            excelKccx.Cells[1, i + 1] = dt.Columns[i].ColumnName.ToString();
        }
        for (int i = 0; i < dt.Rows.Count; i++)//取记录值
        {

            for (int j = 0; j < dt.Columns.Count; j++)
            {
                excelKccx.Cells[row,j + 1] = dt.Rows[i][j].ToString();
            }
            row++;
        }
        excelKccx.Visible = true;//使excel可见,输出Excel文件*/
    }
    protected bool Copy_File(string path, string path2)
    {
        try
        {
            //using (FileStream fs = File.Create(path)) { }
            File.Delete(path2);
            File.Copy(path, path2);
            return true;
        }
        catch //(Exception e)
        {
            return false;
            // Console.WriteLine(e.ToString());
        }
    }
    public void UpAsExcel()
    { 
    }
}

14 个解决方案

#1


权限问题.
试着设置访问账号有操作权限
不过那样不安全.

#2


EXCEL操作权限

可以搜索一下EXCEL DCOM权限设置

#3


iis有没有问题啊!

#4


回楼上的几位:
DCOM组件服务中给MICROSOFT.EXCEL组件 赋予ASP.NET的操作权限我已经做了,不做这个之前会提示类似这样的错误:Creating an instance of the COM component with CLSID 做了之后这个问题没有了,就是出现点击按钮后页面只是加载并刷新了下,没有导出和打开excel的操作。程序也不报错。而在VS里面运行程序的时候一切都是正常的,点击按钮后能导出和打开excel文件。

回三楼的:
IIS肯定是装好了的,要不怎么能访问页面呢?

#5


在网站要操作的文件夹中添加everyone或者network service账号并赋权试试.

#6


不行啊,那位救救偶吧。。。。

#7


以前遇到的问题是 发布以后报错,excel文件格式不正确。错误格式右键用记事本打开的时候是html格式的。不知道是不是这个。。。

#8


这个问题我也碰到过。
 一般情况下是DCOM中的权限配置问题。

#9


引用 7 楼 liu_angelkismet 的回复:
以前遇到的问题是 发布以后报错,excel文件格式不正确。错误格式右键用记事本打开的时候是html格式的。不知道是不是这个。。。


不是,你这个问题是输出EXCEL文件的方法问题。

#10


继续在线等。。。。

#11


我也等

#12


最后重新写了个方法,导出。

#13



检索 COM 类工厂中 CLSID 为 ? 的组件时失败 解决方案,以前有用asp.net导出excel,在本机测试通过,但部署到服务器上提示检索 COM 类工厂中 CLSID 为 ? 的组件时失败,在网上找了很多相关的内容都说的不是很清楚,大多为抄袭,没有亲自去试验过,今天又有个项目需要这样做,特点总结一下与大家分享一下。

遇到这样的错误,就是IIS没有调用excel com组建的权限,添加适当的权限就可以解决这个问题,网上就又提到吧什么administrator 或是everyone,这样做太不安全了,在局域网到还是可以这么做,但是如果在公网最后不要,这样很容易受到攻击。

讲一下具体的解决方案,实际上就是设置权限了。

1.在运行中输入dcomcnfg.exe







2.右击属性







 





IIS_WPG; IUSR_; IWAM_

三个权限都要添加,如果你的WEB用的是默认账号的话。

 

#14


谢谢楼上的这么久了好来回复,留着给需要用的人吧。

#1


权限问题.
试着设置访问账号有操作权限
不过那样不安全.

#2


EXCEL操作权限

可以搜索一下EXCEL DCOM权限设置

#3


iis有没有问题啊!

#4


回楼上的几位:
DCOM组件服务中给MICROSOFT.EXCEL组件 赋予ASP.NET的操作权限我已经做了,不做这个之前会提示类似这样的错误:Creating an instance of the COM component with CLSID 做了之后这个问题没有了,就是出现点击按钮后页面只是加载并刷新了下,没有导出和打开excel的操作。程序也不报错。而在VS里面运行程序的时候一切都是正常的,点击按钮后能导出和打开excel文件。

回三楼的:
IIS肯定是装好了的,要不怎么能访问页面呢?

#5


在网站要操作的文件夹中添加everyone或者network service账号并赋权试试.

#6


不行啊,那位救救偶吧。。。。

#7


以前遇到的问题是 发布以后报错,excel文件格式不正确。错误格式右键用记事本打开的时候是html格式的。不知道是不是这个。。。

#8


这个问题我也碰到过。
 一般情况下是DCOM中的权限配置问题。

#9


引用 7 楼 liu_angelkismet 的回复:
以前遇到的问题是 发布以后报错,excel文件格式不正确。错误格式右键用记事本打开的时候是html格式的。不知道是不是这个。。。


不是,你这个问题是输出EXCEL文件的方法问题。

#10


继续在线等。。。。

#11


我也等

#12


最后重新写了个方法,导出。

#13



检索 COM 类工厂中 CLSID 为 ? 的组件时失败 解决方案,以前有用asp.net导出excel,在本机测试通过,但部署到服务器上提示检索 COM 类工厂中 CLSID 为 ? 的组件时失败,在网上找了很多相关的内容都说的不是很清楚,大多为抄袭,没有亲自去试验过,今天又有个项目需要这样做,特点总结一下与大家分享一下。

遇到这样的错误,就是IIS没有调用excel com组建的权限,添加适当的权限就可以解决这个问题,网上就又提到吧什么administrator 或是everyone,这样做太不安全了,在局域网到还是可以这么做,但是如果在公网最后不要,这样很容易受到攻击。

讲一下具体的解决方案,实际上就是设置权限了。

1.在运行中输入dcomcnfg.exe







2.右击属性







 





IIS_WPG; IUSR_; IWAM_

三个权限都要添加,如果你的WEB用的是默认账号的话。

 

#14


谢谢楼上的这么久了好来回复,留着给需要用的人吧。