C# 如何在ASP.NET中将创建的excel文件保存到客户端电脑
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10974930/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to save created excel file to Client pc in ASP.NET
提问by EmreAltun
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 ?
我在 asp.net 中创建了一个 excel 报告和 html 报告,当我点击按钮和我的应用程序创建它并保存到客户端桌面时,但它无法正常工作,因为 excel 文件正在服务器的桌面中创建。我该如何解决这个问题?
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++;
}
采纳答案by vendettamit
You need to send the file to client using Response object. To ignore the warning message like when client is opening the excel file -
您需要使用 Response 对象将文件发送到客户端。要忽略客户端打开 excel 文件时的警告消息 -


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();
回答by Christoph
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.
您不能直接将其保存到特定的客户端位置。您可以做的是返回带有该请求的文件,以便在浏览器端弹出“保存文件”对话框。
回答by Damith
You can write excel file to response HttpResponse.WriteFile Method
你可以写excel文件来响应HttpResponse.WriteFile方法
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();
回答by IsaacBok
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:
需要注意的一件重要事情是所选的最佳答案适合您:
您必须使用与问题中暗示的 Microsoft.Office.Interop.Excel 不同的库。您必须使用 EPPlus。这是您在项目中设置它的方式:
- 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;)
- 从 Visual Studio 的包管理器控制台,键入:Install-Package EPPlus(这将根据需要安装库和参考)
- 添加此 using 语句 (
using OfficeOpenXml;)
And this is some sample code to create the excel package (pck) as referred to in the best answer:
这是一些示例代码,用于创建最佳答案中提到的 excel 包 (pck):
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.
现在您可以使用最佳答案中提供的代码。

