Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在浏览器中打开Excel文件时未调用Excel_C#_Excel_Asp.net Mvc 4 - Fatal编程技术网

C# 在浏览器中打开Excel文件时未调用Excel

C# 在浏览器中打开Excel文件时未调用Excel,c#,excel,asp.net-mvc-4,C#,Excel,Asp.net Mvc 4,我正在调用一个函数来返回Excel文件,但它并没有在Excel中打开,而是在浏览器中打开另一个选项卡。以下是我的看法: @model InventoryControl.Models.AdminModel <div> @if (Model.TableCounts != null) { <table class="table_body"> <tr> <th>@Html.DisplayNameFor(

我正在调用一个函数来返回Excel文件,但它并没有在Excel中打开,而是在浏览器中打开另一个选项卡。以下是我的看法:

 @model InventoryControl.Models.AdminModel

 <div>
@if (Model.TableCounts != null)
{
    <table class="table_body">
        <tr>
            <th>@Html.DisplayNameFor(x=>x.TableCountModel.TableName)</th>
            <th>@Html.DisplayNameFor(x=>x.TableCountModel.Rows)</th>
            <th>@Html.DisplayNameFor(x=>x.TableCountModel.Count)</th>
            <th>@Html.DisplayNameFor(x=>x.TableCountModel.Size)</th>
        </tr>
        @foreach (var item in Model.TableCounts)
        {
            <tr>
                <td>
                    @item.TableName
                </td>
                <td>
                    @item.Rows
                </td>
                <td>
                    @item.Count
                </td>
                <td>
                    @item.Size
                </td>
            </tr>
        }
    </table>
}
else
{
    <p><i>No data available</i></p>
}
  </div>
<div>
@Html.ActionLink("Excel", "Excel")
</div>
我徒劳地寻找了一个有效的例子,却找不到有效的例子

如果我进行此更改:

 Response.AddHeader("Content-Dispositon", "attachment; filename=TableCounts.xlsx");
        Response.ContentType = "application/vnd.ms-excel";

“文件保存/打开”对话框已启动,但显示为Excel 2003格式,文件名为“Excel”。

请检查默认程序以打开csv文件,并将其设置为Excel。

您的代码不会创建Excel文件,而是创建csv文件。内容类型也不是特定于Excel的。浏览器可能会决定Excel是否是打开此文本文件的适当应用程序

即使浏览器选择Excel,打开文件也可能失败,例如,如果客户端的区域设置使用
作为十进制分隔符。这在欧洲国家很常见。在这种情况下,Excel expect
作为字段分隔符,可以作为单个文本块打开CSV

与其试图欺骗浏览器在Excel中打开CSV,不如使用类似的库创建一个真正的Excel文件。EPPlus是一个可用的软件包,因此很容易将其添加到您的项目中

该库的文档包含关于如何在Web应用程序中使用它的详细信息。从示例中删除格式化代码后,代码非常简单:

   private void DumpExcel(DataTable tbl)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {
            //Create the worksheet
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

            //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
            ws.Cells["A1"].LoadFromDataTable(tbl, true);


            //Write it back to the client
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
            Response.BinaryWrite(pck.GetAsByteArray());
        }
    }

Excel文件是压缩的,这意味着将文件发送到客户端会快得多,特别是对于大型文件

CSV文件不是Excel文件。客户端的计算机没有理由使用Excel来读取它,除非Excel是默认的程序。@PanagiotisKanavos-true,但大多数都在这里。我的是这样设置的,它不会在excel中打开。我的是这样设置的,它不会在excel中打开。我已将该包添加到我的项目中,我的控制器无法识别该excel包-我应该包括什么?使用OfficeOpenXml添加

   private void DumpExcel(DataTable tbl)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {
            //Create the worksheet
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

            //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
            ws.Cells["A1"].LoadFromDataTable(tbl, true);


            //Write it back to the client
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
            Response.BinaryWrite(pck.GetAsByteArray());
        }
    }