Reputation: 423
I am creating a excel report and html report in asp.net when I clik the button and my application create it and save to the client desktop but, it is not working correctly because excel file is creating in server's desktop. How can I fix this matter ?
Thank you for your reply.
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++;
}
Upvotes: 1
Views: 28602
Reputation: 434
One important thing to note so that the selected best answer works for you:
You have to use to use a different library than the Microsoft.Office.Interop.Excel implied in the question. You have to use EPPlus. This is how you set it up in your project:
using OfficeOpenXml;
)And this is some sample code to create the excel package (pck) as referred to in the best answer:
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";
Now you can use the code provided in the best answer.
Upvotes: 1
Reputation: 63065
You can write excel file to response 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();
Upvotes: 2
Reputation: 14677
You need to send the file to client using Response object. To ignore the warning message like when client is opening the excel file -
To prevent this you need to mention the content type and length in the response use the sample code
//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();
Upvotes: 3
Reputation: 27975
You can not directly save it to a specific clientside location. What you can do is returning the file with that request so that on the browser side a "save file" dialog pops up.
Upvotes: 0