programing

열려는 파일이 As에서 파일 확장명으로 지정된 형식과 다릅니다.그물

goodsources 2023. 7. 15. 10:04
반응형

열려는 파일이 As에서 파일 확장명으로 지정된 형식과 다릅니다.그물

열려는 파일이 excel에서 파일을 열려고 할 때 파일 확장자 c# 오류에 의해 지정된 형식과 다릅니다.

여기 제 코드가 있습니다.

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");

}

엑셀을 열려고 할 때 이 오류가 발생합니다.

열려는 파일이 파일 확장명으로 지정된 형식과 다릅니다.

enter image description here

예를 클릭한 후 파일이 제대로 열립니다. 그러나 이 메시지가 표시되지 않도록 합니다.

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();
}

설치된 ClosedXNuget Package Manager를 사용하는 내 프로젝트의 ML.

열려는 파일이 파일 확장명으로 지정된 형식과 다릅니다.

생성된 파일이 실제 엑셀 파일이 아니기 때문에 경고 메시지가 계속 표시됩니다.생성된 파일을 들여다보면 html 태그의 묶음일 뿐입니다.기억하세요.GridView의 RenderControl은 html 테이블을 생성합니다.

문제를 해결하려면 실제 Excel 파일(NPOI가 사용할 수 있는 도구 중 하나)을 생성하는 타사 도구를 사용하거나 쉼표로 구분된 파일 또는 단순히 csv 파일을 생성한 후 해당 파일을 반환해야 합니다.

만약 다른 사람이 이걸 우연히 발견한다면,저는 C#에서 블롭을 즉시 파일로 변환해야 했습니다.pdf는 잘 작동했고 excel은 OP가 설명하는 것과 같은 오류를 주었습니다.

이것은 다른 파일 형식과 다르게 엑셀을 처리하는 코드입니다.

엑셀 애플리케이션/옥텟 스트림에 실제 파일 이름을 부여하여 문제를 해결했습니다.아마도 그것을 하는 가장 깨끗한 방법은 아닐 것이지만 그것은 나의 목적에 충분했습니다.

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();

CloseXML로 데이터셋을 Excel 파일로 내보내야 하는 경우.

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

xlsx.Worksheets.Add(dataTable);

xlsx.SaveAs("export.xlsx");

언급URL : https://stackoverflow.com/questions/16144900/the-file-you-are-trying-to-open-is-in-a-different-format-than-specified-by-the-f

반응형