我使用ExcelLibrary生成动态Excel工作表。哪个效果很好。
代码
//create new xls file
string file = Server.MapPath("Discussion_Board_Report.xls");
Workbook workbook = new Workbook();
Worksheet worksheet = new Worksheet("Report");
worksheet.Cells[0, 0] = new Cell("COMM 226 Case Discussions Report");
worksheet.Cells[4, 0] = new Cell("Student ID");
worksheet.Cells[4, 1] = new Cell("User Name");
worksheet.Cells[4, 2] = new Cell("Case 1");
worksheet.Cells[4, 3] = new Cell("Case 2");
worksheet.Cells[4, 4] = new Cell("Case 3");
worksheet.Cells[4, 5] = new Cell("Topics");
worksheet.Cells[4, 6] = new Cell("Replies");
workbook.Worksheets.Add(worksheet);
workbook.Save(file);
问题
此代码出现问题,是要将文件保存在服务器中。我无法在C://中保存文件,因为Windows希望允许我在没有用户许可的情况下保存!我希望用户选择自己的文件路径。如何提示“另存为”对话框?
答案 0 :(得分:2)
看起来你正在使用EPPlus,它在ExcelPackage对象上有一个Stream属性,我相信你可以用来写入响应流。我已经包含了一些类似于我过去用来下载文件的代码。
然后我将此逻辑放入我链接到的页面的页面加载中。
ExcelPackage package = new ExcelPackage();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Name Here");
///worksheet logic
var msArray = package.Stream;
var response = HttpContext.Current.Response;
response.Clear();
response.ClearHeaders();
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment; filename={0}.xls".FormatWith(reportName));
response.AddHeader("Content-Length", msArray.Length.ToString());
response.OutputStream.Write(msArray, 0, msArray.Length);
response.Flush();
response.End();
答案 1 :(得分:1)
您需要做的是将文件流式传输给用户。我确信workbook
课程提供保存到Stream
,在这种情况下Response Stream
喜欢这个:
Response.ContentType = "application/vnd.ms-excel";
//Force the browser to offer to download the file
Response.AddHeader("content-disposition", "attachment; filename=file.xlsx");
workbook.SaveToStream(Response.OutputStream);
更新
显然,在.NET 4和现在claims to support it by doing this之前,Excel库的作者不支持这个:
MemoryStream m = new MemoryStream(); // Temp Stream
workbook.Save(m);
m.CopyTo(Response.OutputStream);
更新2
实际上,作者并不是那个声称在MemoryStream
上调用Workbook的Save方法可以工作而不是其他人的人。作者实际上推荐了这段愚蠢的代码。
DataSet ds = GetData();
MemoryStream m = new MemoryStream();
ExcelLibrary.DataSetHelper.CreateWorkbook(m , ds);
m.WriteTo(Response.OutputStream);
如果这不起作用,那么如果您完全停止使用该库并使用EPPlus,我恐怕您会感觉更好。
答案 2 :(得分:0)
您无法在纯应用程序中执行此操作。您的代码在服务器上运行 - 而不是在用户的计算机上运行。
您可以在服务器上生成Excel文件,然后为您的用户提供下载链接,但无法将服务器上的代码直接保存到用户的计算机上。
您可以尝试使用像Silverlight这样的客户端插件执行类似操作,并且您将无限制地访问Silverlight公开的文件系统。
也许您可以让我们更多地了解您尝试做的事情,我们可以提供更好的指导。
答案 3 :(得分:0)
您可以尝试 FileUpload 服务器控件。
在yourfile.aspx中使用:
<asp:FileUpload ID="FileUpload1" runat="server" />
在yourfile.aspx.cs中使用它来保留用户选择的路径:
Server.MapPath(FileUpload1.FileName);