Файл, который вы пытаетесь открыть, находится в другом формате, чем указано в расширении файла в Asp.Net - программирование
Подтвердить что ты не робот

Файл, который вы пытаетесь открыть, находится в другом формате, чем указано в расширении файла в Asp.Net

файл, который вы пытаетесь открыть, находится в другом формате, чем указано при расширении файла С# при попытке открыть файл в excel.

Вот мой код

public ActionResult Export(string filterBy)
{
    MemoryStream output = new MemoryStream();
    StreamWriter writer = new StreamWriter(output, Encoding.UTF8);

    var data = City.GetAll().Select(o => new
    {
        CountryName = o.CountryName,
        StateName = o.StateName,
        o.City.Name,
        Title = o.City.STDCode
    }).ToList();
    var grid = new GridView { DataSource = data };
    grid.DataBind();
    var htw = new HtmlTextWriter(writer);

    grid.RenderControl(htw);

    writer.Flush();
    output.Position = 0;

    return File(output, "application/vnd.ms-excel", "test.xls");

}

когда я пытаюсь открыть excel, я получаю эту ошибку

файл, который вы пытаетесь открыть, находится в другом формате, чем указанный расширением файла

enter image description here

После нажатия кнопки "Да" файл открывается правильно. но я не хочу, чтобы этот msg появлялся.

4b9b3361

Ответ 1

Я использовал CloseXML, чтобы решить проблему.

public static void ExportToExcel(IEnumerable<dynamic> data, string sheetName)
{
    XLWorkbook wb = new XLWorkbook();
    var ws = wb.Worksheets.Add(sheetName);
    ws.Cell(2, 1).InsertTable(data);
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx",sheetName.Replace(" ","_")));

    using (MemoryStream memoryStream = new MemoryStream())
    {
        wb.SaveAs(memoryStream);
        memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
        memoryStream.Close();
    }

    HttpContext.Current.Response.End();
}

Установленный ClosedXML в моем проекте с помощью Nuget Package Manager.

Ответ 2

файл, который вы пытаетесь открыть, находится в другом формате, чем указанный расширением файла

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

Чтобы устранить проблему, вам нужно либо использовать сторонний инструмент, создающий реальный файл excel (один инструмент, который вы, возможно, захотите использовать, - NPOI) или создать файл с разделителями-запятыми или просто файл csv и вернуть этот файл.

Ответ 3

В случае, если кто-то другой наткнется на это... Мне нужно было преобразовать капли обратно в файлы на лету в С#. Pdf работал хорошо, и excel дал мне ту же ошибку, что объясняет OP.

Это код, который я написал, который обрабатывает excel иначе, чем другие типы файлов.

Предоставление приложения excel/октетного потока с фактическим именем файла решило мою проблему. Наверное, не самый чистый способ сделать это, но это было достаточно хорошо для моих целей.

string theExt = Path.GetExtension(theDoc.documentFileName).ToUpper();

Response.Clear();

if (theExt == ".XLS" || theExt == ".XLSX"){
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentFileName));
    }
else{
    Response.ContentType = theDoc.documentMimeType;
    Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentTitle));
}

using (MemoryStream stream = new MemoryStream(theDoc.file))
{
    stream.WriteTo(Response.OutputStream);
    stream.Close();
};

Response.End();

Ответ 4

Если кому-то нужно экспортировать набор данных в файл Excel, CloseXML.

Dataset ds = { your data from db }
var xlsx = new XLWorkbook();
var dataTable = ds.Tables[0];

xlsx.Worksheets.Add(dataTable);

xlsx.SaveAs("export.xlsx");