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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 15:59:20  来源:igfitidea点击:

How to save created excel file to Client pc in ASP.NET

c#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 文件时的警告消息 -

enter image description here

在此处输入图片说明

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。这是您在项目中设置它的方式:

  1. From Visual Studio's Package Manager Console, type: Install-Package EPPlus (this will install the library and the reference as needed)
  2. Add this using statement (using OfficeOpenXml;)
  1. 从 Visual Studio 的包管理器控制台,键入:Install-Package EPPlus(这将根据需要安装库和参考)
  2. 添加此 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.


现在您可以使用最佳答案中提供的代码。