2012-06-11 3 views
1

Я создаю отчет excel и html-отчет в asp.net, когда я нажимаю кнопку и мое приложение создаю ее и сохраняю на рабочем столе клиента, но это не правильно работает, потому что файл excel создается на рабочем столе сервера. Как я могу это исправить?Как сохранить созданный файл excel на клиентский ПК в ASP.NET

Благодарим вас за ответ.

string CurrentDate; 
DateTime saveNow = DateTime.Now; 
CurrentDate = saveNow.Date.ToShortDateString(); 
string reportContent = prepareHTM(); 

string pathFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory) + "\\As_Build_Report_ "+ CurrentDate + ".html"; 

using (StreamWriter outfile = new StreamWriter(pathFile, true)) 
{ 
    outfile.WriteLine(reportContent); 
} 
System.Diagnostics.Process.Start(pathFile); 

object missing = System.Reflection.Missing.Value; 
//Start Excel Application. 
Excel.Application oXL = new Excel.Application(); 
oXL.Visible = true; //display Application .    
Excel._Workbook oWB = (Excel._Workbook)(oXL.Workbooks.Add(missing));//create a new workbook. 
Excel._Worksheet oSheet = (Excel._Worksheet)oWB.ActiveSheet; //create a sheet     

string CurrentDate; 
DateTime saveNow = DateTime.Now; 
CurrentDate = saveNow.Date.ToString(); 
int keep = 5; 
string project = list[0].Project; 
oSheet.Cells[1, 3] = "MiKES Configuration Management __" + project + "__ As-Built Report"; 
oSheet.Cells[3, 1] = "Report Date :"; 
oSheet.Cells[3, 2] = CurrentDate; 

oSheet.Cells[keep, 1] = "PART NO"; 
oSheet.Cells[keep, 2] = "REF.DES."; 
oSheet.Cells[keep, 3] = "DESCRIPTION"; 
oSheet.Cells[keep, 4] = "SERIAL NO"; 
oSheet.Cells[keep, 5] = "C/S"; 
oSheet.Cells[keep, 6] = "D/C"; 
oSheet.Cells[keep, 7] = "REMARK"; 
keep++; 
foreach(Classes.CMNewPart item in list) 
{ 
    try 
    { 
     oSheet.Cells[keep, 1] = item.PartNo; 
     oSheet.Cells[keep, 2] = item.RefDes; 
     oSheet.Cells[keep, 3] = item.Description1; 
     oSheet.Cells[keep, 4] = item.SerialNo; 
     oSheet.Cells[keep, 5] = item.Cs; 
     oSheet.Cells[keep, 6] = item.Dc; 
     oSheet.Cells[keep, 7] = item.Remark; 
    } 
    catch (Exception) 
    { 

    } 
    keep++; 
} 
+0

Как в стороне, если вы используете это с сервера, вам действительно нужно использовать OpenXML SDK (или какое-то другое решение) для генерации ваших файлов вместо interop. И почему вы делаете Excel видимым? – Mathias

ответ

4

Необходимо передать файл клиенту с использованием объекта Response. Чтобы проигнорировать предупреждение, как, когда клиент открывает файл Excel -

enter image description here

Для предотвращения этого необходимо упомянуть тип содержимого и длину в ответ использовать образец кода

//Read the Excel file in a byte array. here pck is the Excelworkbook    
Byte[] fileBytes = pck.GetAsByteArray(); 

//Clear the response    
Response.Clear(); 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.Cookies.Clear(); 
//Add the header & other information  
Response.Cache.SetCacheability(HttpCacheability.Private); 
Response.CacheControl = "private"; 
Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
Response.AppendHeader("Content-Length", fileBytes.Length.ToString()); 
Response.AppendHeader("Pragma", "cache"); 
Response.AppendHeader("Expires", "60"); 
Response.AppendHeader("Content-Disposition", 
"attachment; " + 
"filename=\"ExcelReport.xlsx\"; " + 
"size=" + fileBytes.Length.ToString() + "; " + 
"creation-date=" + DateTime.Now.ToString("R") + "; " + 
"modification-date=" + DateTime.Now.ToString("R") + "; " + 
"read-date=" + DateTime.Now.ToString("R")); 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
//Write it back to the client  
Response.BinaryWrite(fileBytes); 
Response.End(); 
+0

спасибо за ваш интерес Я пробую его – EmreAltun

+0

4 года спустя, и это помогло мне, спасибо. –

0

Вы не можете напрямую сохранить его в определенное место клиентского. Что вы можете сделать, так это вернуть файл с этим запросом, чтобы на стороне браузера появилось диалоговое окно «Сохранить файл».

+0

как я могу это сделать, вы можете дать мне дополнительную информацию или простой код. Спасибо – EmreAltun

+0

Я нахожусь на мобильном телефоне. Сделаем это позже сегодня. – Christoph

+0

@EmreAltun Я разместил образец кода, чтобы проверить его. – vendettamit

1

Вы можете написать первенствует файл в ответ HttpResponse.WriteFile Method

string CurrentDate; 
DateTime saveNow = DateTime.Now; 
CurrentDate = saveNow.Date.ToShortDateString(); 
string reportContent = prepareHTM(); 

string pathFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory) + "\\As_Build_Report_ "+ CurrentDate + ".html"; 

using (StreamWriter outfile = new StreamWriter(pathFile, true)) 
{ 
    outfile.WriteLine(reportContent); 
} 

System.IO.FileInfo file = new System.IO.FileInfo(pathFile); 
Response.Clear(); 
Response.Charset="UTF-8"; 
Response.ContentEncoding=System.Text.Encoding.UTF8; 
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
Response.AddHeader("Content-Length", file.Length.ToString());  
Response.ContentType = "application/ms-excel"; 
Response.WriteFile(file.FullName); 
Response.End(); 
1

Одно важное замечание, так й при выбранном наилучшем ответе работает для вас:
Вы должны использовать для использования другую библиотеку, отличную от Microsoft.Office.Interop.Excel, подразумеваемую в вопросе. Вы должны использовать EPPlus. Это, как вы установите его в вашем проекте:

  1. От Package Manager Console Visual Studio, введите: Install-Package EPPlus (это установит библиотеку и ссылки по мере необходимости)
  2. Добавить это с помощью заявления (using OfficeOpenXml;)

И это некоторые примеры кода для создания пакета Excel (ФКК), упоминаемой в лучший ответ:

ExcelPackage pck = new ExcelPackage(); 
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("exported data"); 
    // Excel sheet headings 
    ws.Cells[1, 1].Value = "Column 1 title"; 
    ws.Cells[1, 2].Value = "Column 2 title"; 


Теперь вы можете использовать код, указанный в лучшем ответе.