2016-10-31 3 views
0

Я создал конечную точку, которая генерирует файл Excel. Предполагается, что он будет функционировать как GET, если я хочу, чтобы какой-либо другой код отправил POST на другую конечную точку для отправки по электронной почте или в случае, если я хочу просто загрузить файл Excel, удалив конечную точку вручную в браузере. Он загружает файл Excel, но когда я пытаюсь его открыть, я вижу сообщение «Excel не может открыть файл« blahblah », потому что формат файла или расширение файла недопустимы. Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла. "Ответ C# HttpGet дает мне пустой файл Excel с EPPlus

После получения этой ошибки я попытался изменить тип MIME в поле содержимого ответа и/или расширении файла, и ошибка исчезнет, ​​и файл открывается со следующим предупреждением: «Формат файла и расширение« blah blah "не совпадают. Файл может быть поврежден или небезопасен. Если вы не доверяете его источнику, не открывайте его. Вы все равно хотите его открыть?" Если я его все равно открою, файл все еще пуст.

Вот код, где я беру созданный ExcelPackage и добавляю его в ответ.

var response = HttpContext.Current.Response; 
response.ContentType = "application/vnd.openxmlformats- officedocument.spreadsheetml.sheet"; 
var fileName = string.Format("blahblah-{0}.xls",  InstantPattern.CreateWithInvariantCulture("yyyy-dd-M-HH-mm-ss").Format(_clock.Now)); 
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName)); 
response.BinaryWrite(excelPackage.GetAsByteArray()); 

Я попытался добавить другой тип mime, например application/excel. Я пробовал использовать расширение .xlsx вместо xls. Ничего действительно не сработало. Я знаю, что на листах книги ExcelPackage действительно есть данные, которые я хочу, потому что, когда я отлаживаю и наводил на объекты объекты, я вижу значения ячеек, которые я ожидаю внести в файл. Так что я делаю неправильно?

Я пробовал генерировать excelPackage двумя способами, как внутри используемого блока. Как это:

using (var excelPackage = new ExcelPackage()) 
{ 
    // generate and download excel file 
} 

А также, как это:

using (var excelPackage = new ExcelPackage(new FileInfo(fileName))) 
{ 
    // generate and download excel file 
} 
+0

Тип mime просто указывает браузеру, какое приложение использовать, поэтому, если браузер открывает Excel, когда вы делаете Get, ваш тип Mime правильный. Если вы затем получите ошибку Excel, это потому, что все байты передаются не в ожидаемом формате. Как вы создаете excelPackage? Вероятно, это проблема. – Theo

+0

@ Theo Я пробовал генерировать ExcelPackage с помощью конструктора по умолчанию (без аргументов), а также с конструктором FileInfo, передавая его в том же fileName. В настоящее время я делаю весь этот код внутри блока использования, который я буду редактировать в исходном вопросе. – HandleThatError

+0

Возможно, что что-то еще в вашем действии Controller модифицирует ваше содержимое ответа после того, как вы напишите ему байты. Попробуйте добавить «response.End» после написания байтов. – Theo

ответ

1

Я использую это, чтобы отправить Excel файл в браузере.

HttpResponse Response = HttpContext.Current.Response; 

//first convert to byte array 
byte[] bin = excelPackage.GetAsByteArray(); 

//clear the buffer stream 
Response.ClearHeaders(); 
Response.Clear(); 
Response.Buffer = true; 

//add the content type 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

//set the content length, without it, length is set to -1 and could give errors 
Response.AddHeader("content-length", bin.Length.ToString()); 

//add a filename 
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".xlsx\""); 

//send the file to the browser 
Response.OutputStream.Write(bin, 0, bin.Length); 

//cleanup 
Response.Flush(); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
+0

Спасибо! Это действительно работает! Я думаю, что в других примерах, которые я видел на следующем, отсутствовали длина содержимого и разделы выходного потока. – HandleThatError

Смежные вопросы