2016-01-18 2 views
0

Я пытаюсь использовать EPPlus для создания отчета в приложении ASP.NET. Я попытался использовать код, предоставленный в пакет образцов, но у меня возникли проблемы.Корректный вывод файла Excel с использованием EPPlus в ASP.NET/C#

Следующий код выполняется без ошибок:

 ExcelPackage pck = new ExcelPackage(); 
     var ws = pck.Workbook.Worksheets.Add("Sample1"); 

     _ws.Cells["A1"].Value = "COD. CONV."; 
     _ws.Cells["A1"].Style.Font.Bold = true; 
     _ws.Cells["A1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 
     _ws.Cells["B1"].Value = "RAGIONE SOCIALE"; 
     _ws.Cells["B1"].Style.Font.Bold = true; 
     _ws.Cells["B1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 
     _ws.Cells["C1"].Value = "COMMERCIALE A"; 
     _ws.Cells["C1"].Style.Font.Bold = true; 
     _ws.Cells["C1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 
     _ws.Cells["D1"].Value = "PROVINCIA"; 
     _ws.Cells["D1"].Style.Font.Bold = true; 
     _ws.Cells["D1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 
     _ws.Cells["E1"].Value = "ZONA"; 
     _ws.Cells["E1"].Style.Font.Bold = true; 
     _ws.Cells["E1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 
     _ws.Cells["F1"].Value = "TELEFONO"; 
     _ws.Cells["F1"].Style.Font.Bold = true; 
     _ws.Cells["F1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 
     _ws.Cells["G1"].Value = "EMAIL"; 
     _ws.Cells["G1"].Style.Font.Bold = true; 
     _ws.Cells["G1"].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick; 

     int _i = 2; 

     foreach (DataRow _drRow in dtAnagrafiche.Rows) 
     { 
      _ws.Cells["A"+_i.ToString()].Value = _drRow["codice"].ToString(); 
      _ws.Cells["B"+_i.ToString()].Value = _drRow["Nome"].ToString(); 
      _ws.Cells["C"+_i.ToString()].Value = ""; 
      _ws.Cells["D"+_i.ToString()].Value = _drRow["Provincia"].ToString(); 
      _ws.Cells["E"+_i.ToString()].Value = _drRow["Zona"].ToString(); 
      _ws.Cells["F"+_i.ToString()].Value = _drRow["Telefono"].ToString(); 
      _ws.Cells["G"+_i.ToString()].Value = _drRow["Email"].ToString(); 

      _i++; 
     } 

     Response.BinaryWrite(_pck.GetAsByteArray()); 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader("content-disposition", "attachment; filename=Lista_Anagrafiche.xlsx"); 

но полученный файл не может быть открыт офис Microsoft, если не «выздоровел», другие приложения совместим MS Office (т.е. OpenOffice) не может открыть файл.

Я могу предоставить выходной файл, если необходимо.

https://drive.google.com/file/d/0B-lPXYt7laDrbUFKbFZEWEwxckk/view?usp=sharing

BTW Я использую последнюю (4.0.5) EPPlus пакет, полученный корыто NuGet, и запустить его в ASP.NET 4.5 веб-приложением с.

+1

Извините, не повезло, даже изменив звонок «BinaryWrite». – weirdgyn

+0

возможно, попробуйте Response.Clear перед ответом.BinaryWrite? можете ли вы попытаться сохранить байты в файл сначала, чтобы отделить проблемы между выходом файла Excel и записать его обратно через ответ? вы пытались открыть файл результатов в «Блокноте»? –

+1

@shriop: открытие файла в блокноте было бы бесполезным, так как файлы .xlsx сжаты как zip-файлы. – willaien

ответ

2

Вы пропустили вызов Response.End(). Без этого вы отправляете ответ с бинарной полезной нагрузкой (файл .xlsx), которая поступает правильно, а затем .aspx-страницу, которую вы кодируете в этом разделе, также отправляется в полезную нагрузку. Proof here as shown in a hex editor.

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("content-disposition", "attachment; filename=Lista_Anagrafiche.xlsx"); 
    Response.BinaryWrite(_pck.GetAsByteArray()); 
    Response.End(); 

Необходимо сделать трюк.

Как в стороне, я бы предложил сохранить файл, а затем сделать Response.Redirect() по URL-адресу файла, но это не связано с этой конкретной проблемой.

EDIT: Примечательно, что в обычных обстоятельствах я бы предложил избегать Response.End(), но это самый быстрый способ решить проблему, в которую вы закодировали себя. Я бы предложил искать лучшие способы обслуживания этих файлов в общем, согласно моему предложению выше Response.Redirect() в сохраненное местоположение файла.

1

Попробуйте изменить свой код на следующем Обратите внимание, как я использую функцию string.Format для создания файла + расширения

вам нужно объявить постоянную FileName. если хуже приходит к худшему изменить .xlsx к .xls

Response.Clear();  
Response.ClearHeaders(); 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.xlsx", fileName)); 
Response.BinaryWrite(_pck.GetAsByteArray()); 
Response.Flush(); 
Response.End(); 
+0

Thnx! '.xls' несколько отличается от' .xslx' ... в любом случае ваше предложение в порядке! thnx – weirdgyn

+0

не проблема в вашем имени файла. Я бы не стал его жестко кодировать. Я бы использовал функцию string.Format, чтобы он мог динамически создавать файл, поэтому, если вы хотите создать имя файла с именем и датой и т. д. t нужно жестко закодировать его, например 'public string fileName =" Lista_Anagrafiche_ {0} ";' 'fileName = string.Format (имя_файла, DateTime.Now.ToString (" MMddyyyy_hhmmss "));' просто предложение – MethodMan

+0

my спекуляция заключалась в изменении расширения файла с тем, который не соответствовал реальному содержимому самого файла ... в любом случае настоящий код я не жестко кодирую имя файла внутри приложения, но я его генерирую во время выполнения. – weirdgyn

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