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++;
}
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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();
Method 2
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();
Method 3
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:
- From Visual Studio’s Package Manager Console, type: Install-Package EPPlus (this will install the library and the reference as needed)
- Add this using statement (
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.
Method 4
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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0