C# 如何使用EPPlus和MVC从服务器下载.xslx文件
我使用EPPlus在服务器上生成了一个Excel文件。该文件制作正确,并且使用了窗口。location在本地计算机上运行良好,但在部署到服务器上时却不起任何作用。我试图通过MVC控制器返回FileStreamResult,但我认为它不起作用。我正在使用ajax调用访问controller方法,但它无法进入。方法运行完毕后完成 我一直在找我的C#reference 剧本C# 如何使用EPPlus和MVC从服务器下载.xslx文件,c#,asp.net-mvc,excel,download,epplus,C#,Asp.net Mvc,Excel,Download,Epplus,我使用EPPlus在服务器上生成了一个Excel文件。该文件制作正确,并且使用了窗口。location在本地计算机上运行良好,但在部署到服务器上时却不起任何作用。我试图通过MVC控制器返回FileStreamResult,但我认为它不起作用。我正在使用ajax调用访问controller方法,但它无法进入。方法运行完毕后完成 我一直在找我的C#reference 剧本 function exportToExcel() { var batchName = $("#batchDateSel
function exportToExcel() {
var batchName = $("#batchDateSelect option:selected").text();
var bID = $("#batchDateSelect").val();
var params = {
BatchID: bID,
BatchName: batchName
};
$.post(path + "Export/ExportToExcel", params)
.done(function (Data, textStatus, jqXHR) {
var fileName = "";
////window.location = path + "ExportFiles/"+fileName;
});
}
控制器
public ActionResult ExportToExcel(int BatchID,string BatchName)
{
FileStreamResult FSR = DataAccess.ExportUtility.CreateExcelFile(BatchID, BatchName);
return FSR;
}
public static string ContentType { get; set; }
public static string FilePath { get; set; }
public static string FileName { get; set; }
public static byte[] Bytes { get; set; }
public void ExportToExcel(int BatchID,string BatchName)//is called first to set the variables
{
string contentType;
byte[] bytes;
string ret = DataAccess.ExportUtility.CreateExcelFile(BatchID, BatchName,out contentType, out bytes);
ContentType = contentType;
Bytes = bytes;
FileName = ret[1];
}
public ActionResult DownloadExcelFile()//is then called to download the file
{
return File(Bytes, ContentType, FileName);
}
EPPlus法
public static FileStreamResult CreateExcelFile(int batchid,string batchName)
{
string fileName = batchName + " Reason_Code_Export.xlsx";
var serverPath = HttpContext.Current.Server.MapPath("~/ExportFiles/");
DirectoryInfo outputDir = new DirectoryInfo(serverPath);
FileInfo newfile = new FileInfo(outputDir.FullName + fileName);
if (newfile.Exists)
{
newfile.Delete();
newfile = new FileInfo(outputDir.FullName + fileName);
}
Dictionary<string,int> MAData = PolicyDataAccess.GetMatchActionData(batchid);
MemoryStream MS = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(newfile))
{
..........
........
package.SaveAs(MS);
}
MS.Position = 0;
var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
FileStreamResult FSR = new FileStreamResult(MS, contentType);
FSR.FileDownloadName = fileName;
return FSR;
}
publicstaticfilestreamresult CreateExcelFile(int-batchid,string-batchName)
{
字符串文件名=batchName+“原因\代码\导出.xlsx”;
var serverPath=HttpContext.Current.Server.MapPath(“~/ExportFiles/”);
DirectoryInfo outputDir=新的DirectoryInfo(serverPath);
FileInfo newfile=newfileinfo(outputDir.FullName+fileName);
if(newfile.Exists)
{
newfile.Delete();
newfile=newfileinfo(outputDir.FullName+fileName);
}
Dictionary MAData=PolicyDataAccess.GetMatchActionData(batchid);
MemoryStream MS=新的MemoryStream();
使用(ExcelPackage=新的ExcelPackage(新文件))
{
..........
........
软件包.SaveAs(MS);
}
MS.Position=0;
var contentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
FileStreamResult FSR=新的FileStreamResult(MS,contentType);
FSR.FileDownloadName=文件名;
返回FSR;
}
获取该文件的最简单方法是什么?EPPLUS让我非常头疼
我对MVC不太熟悉,但我假设您希望直接编写输出响应。在这种情况下,我使用下面的内容。
我在评论中看到,内存流写入也可以工作。这更接近于您要求执行的操作,但我目前没有在代码中使用它。所以买家要小心。
.干杯
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader( "Content-Disposition", "attachment; filename=ProposalRequest-" + fileName + ".xslx" );
Response.BinaryWrite( pck.GetAsByteArray() );
// myMemoryStream.WriteTo(Response.OutputStream); //works too
Response.Flush();
Response.Close();
DougY发帖的答案可能很好,但是在他发帖之前我确实找到了一个解决方案 我不会将此标记为已回答,因为我相信有更好的方法,如果有人想发布或评论什么是最好的方法,我会标记一个答案 谢谢你的回复,道格 控制器的两种方法可能会结合在一起,但结果就是这样 控制器
public ActionResult ExportToExcel(int BatchID,string BatchName)
{
FileStreamResult FSR = DataAccess.ExportUtility.CreateExcelFile(BatchID, BatchName);
return FSR;
}
public static string ContentType { get; set; }
public static string FilePath { get; set; }
public static string FileName { get; set; }
public static byte[] Bytes { get; set; }
public void ExportToExcel(int BatchID,string BatchName)//is called first to set the variables
{
string contentType;
byte[] bytes;
string ret = DataAccess.ExportUtility.CreateExcelFile(BatchID, BatchName,out contentType, out bytes);
ContentType = contentType;
Bytes = bytes;
FileName = ret[1];
}
public ActionResult DownloadExcelFile()//is then called to download the file
{
return File(Bytes, ContentType, FileName);
}
导出实用程序类
public static string[] CreateExcelFile(int batchid,string batchName,out string ContentType, out byte[] Bytes)
{
string fileName = batchName + " Reason_Code_Export.xlsx";
var serverPath = HttpContext.Current.Server.MapPath("~/ExportFiles/");
DirectoryInfo outputDir = new DirectoryInfo(serverPath);
byte[] bytes;
FileInfo newfile = new FileInfo(outputDir.FullName + fileName);
if (newfile.Exists)
{
newfile.Delete();
newfile = new FileInfo(outputDir.FullName + fileName);
}
Dictionary<string,int> MAData = PolicyDataAccess.GetMatchActionData(batchid);
MemoryStream MS = new MemoryStream();
ExcelPackage package;
using (package = new ExcelPackage(newfile))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(batchName);
worksheet.Cells["A1"].Value = batchName + " Reason_Code_Export";
worksheet.Cells["A1"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
worksheet.Cells["A1:B1"].Merge = true;
worksheet.Cells["A1:B1"].Style.Font.Bold = true;
worksheet.Cells["A2"].Value = "Reason Code";
worksheet.Cells["B2"].Value = "Number of Reason Codes Selected";
worksheet.Cells["A2:B2"].Style.Font.Bold = true;
int row = 3;
int col = 1;
foreach (KeyValuePair<string,int> MA in MAData)
{
worksheet.Cells[row, col].Value = MA.Key;
worksheet.Cells[row, col + 1].Value = MA.Value;
row++;
}
worksheet.Column(1).Width = 34.29;
worksheet.Column(2).Width = 34.29;
package.Workbook.Properties.Title = batchName + " Reason_Code_Export";
package.Workbook.Properties.Author = "Intranet Application: Unclaimed Properties";
package.Workbook.Properties.Company = "Assurity Life 2013";
Bytes = package.GetAsByteArray();
//package.SaveAs(newfile);//MS);
}
MS.Position = 0;
var rl = serverPath + fileName;
var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
ContentType = contentType;
FileStreamResult FSR = new FileStreamResult(MS, contentType);
FSR.FileDownloadName = fileName;
string[] ret = new string[2];
ret[0] = serverPath;
ret[1] = fileName;
return ret;
}
public static string[]CreateExcelFile(int-batchid、string-batchName、out-string-ContentType、out-byte[]Bytes)
{
字符串文件名=batchName+“原因\代码\导出.xlsx”;
var serverPath=HttpContext.Current.Server.MapPath(“~/ExportFiles/”);
DirectoryInfo outputDir=新的DirectoryInfo(serverPath);
字节[]字节;
FileInfo newfile=newfileinfo(outputDir.FullName+fileName);
if(newfile.Exists)
{
newfile.Delete();
newfile=newfileinfo(outputDir.FullName+fileName);
}
Dictionary MAData=PolicyDataAccess.GetMatchActionData(batchid);
MemoryStream MS=新的MemoryStream();
卓越包装;
使用(包=新的ExcelPackage(新文件))
{
Excel工作表=package.Workbook.Worksheets.Add(批处理名称);
工作表。单元格[“A1”]。值=批处理名称+“原因\代码\导出”;
工作表.Cells[“A1”].Style.HorizontalAlignment=ExcelHorizontalAlignment.Center;
工作表。单元格[“A1:B1”]。合并=真;
工作表.Cells[“A1:B1”].Style.Font.Bold=true;
工作表。单元格[“A2”]。Value=“原因代码”;
工作表.单元格[“B2”].Value=“所选原因代码的数量”;
工作表.Cells[“A2:B2”].Style.Font.Bold=true;
int行=3;
int col=1;
foreach(MAData中的KeyValuePair MA)
{
工作表.Cells[row,col].Value=MA.Key;
工作表.Cells[行,列+1].Value=MA.Value;
行++;
}
工作表。第(1)列。宽度=34.29;
工作表。第(2)列。宽度=34.29;
package.Workbook.Properties.Title=batchName+“原因\代码\导出”;
package.Workbook.Properties.Author=“内部网应用程序:无人认领的属性”;
package.Workbook.Properties.Company=“Assurality Life 2013”;
字节=package.GetAsByteArray();
//package.SaveAs(newfile);//MS);
}
MS.Position=0;
var rl=服务器路径+文件名;
var contentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
ContentType=ContentType;
FileStreamResult FSR=新的FileStreamResult(MS,contentType);
FSR.FileDownloadName=文件名;
字符串[]ret=新字符串[2];
ret[0]=服务器路径;
ret[1]=文件名;
返回ret;
}
这个问题我来晚了,但可能对其他人有帮助
设置excel工作表后,不保存或将其添加到MemoryStream,只需将字节数组设置为packge.GetAsByteArray(),然后通过操作将其作为文件返回,而不是FileStreamResult
var FileBytesArray = packge.GetAsByteArray();
return File(FileBytesArray, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename + ".xlsx");
谢谢,这有助于解决使用epplus编辑模板时出现的与“损坏”文件相关的问题