本机可以导出excel到桌面,但是发布后不能导出,调试代码发现路径为空,大神们改怎么解决??
public ActionResult ExportExcelJ()
{
string json = Request.Params["data"];
try
{
DataTable dt = ExcelHelper.JsonToDataTable(json);
string pathDestop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
ExcelHelper.GridToExcelByNPOI(dt, pathDestop + "\\" + "月度奖励绩效" + DateTime.Now.AddMonths(-1).ToString("yyyy-MM") + ".xls");
return Content("1");
}
catch (Exception)
{
return Content("-1");
}
}
要分清楚服务器端和客户端。
在服务器端生成文件流,然后返回,至于保存在什么地方是由用户在客户端决定的。
所以你这里的代码是有问题的,一定要理解服务器端和客户端。
ExcelHelper.GridToExcelByNPOI(dt, pathDestop + "\\" + "月度奖励绩效" + DateTime.Now.AddMonths(-1).ToString("yyyy-MM") + ".xls");
这句代码是你自己或者第三方类库吧,我猜应该是在桌面生成一个excel文件。
本机测试你自己可能觉得没毛病,但代码跑在服务器端。
return File();才对。
也不知道说清楚没有,加油。
发布后调试string pathDestop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);获取路径为空,没有导出,该怎么解决导出问题
da导出到你服务器的桌面了吧.
你先理解下web的导出就是下载
string pathDestop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);获取到的路劲为空,所以也没有导出,麻烦大神说下导出的思路,并提供一些参考代码吧
@爱学习呢: 这个代码是在服务器执行的明白不.
public static MemoryStream DataTableToExcel(DataTable data, bool isColumnWritten)
{
int i = 0;
int j = 0;
int count = 0;
ISheet sheet = null;
MemoryStream ms = new MemoryStream();
XSSFWorkbook workbook = new XSSFWorkbook();
// workbook = WorkbookFactory.Create(fs);
try
{
if (workbook != null)
{
sheet = workbook.CreateSheet("Sheet1");
//默认单元格宽度
sheet.DefaultColumnWidth =15;
}
else
return ms;
if (isColumnWritten == true) //写入DataTable的列名
{
IRow row = sheet.CreateRow(0);
for (j = 0; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = 1;
}
else
{
count = 0;
}
for (i = 0; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = 0; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Rows[i][j] != null ? data.Rows[i][j].ToString() : "");
}
++count;
}
workbook.Write(ms); //写入到excel
return ms;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
return ms;
}
/// <summary>
/// 用于Web导出
/// </summary>
/// <param name="dtSource">源DataTable</param>
/// <param name="strHeaderText">表头文本</param>
/// <param name="strFileName">文件名</param>
public static void ExportByWeb(DataTable dtSource, string strFileName)
{
HttpContext curContext = HttpContext.Current;
// 设置编码和附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
MemoryStream ms=DataTableToExcel(dtSource,true);
curContext.Response.BinaryWrite(ms.ToArray());//这个打开excel会出异常ms.GetBuffer()
curContext.Response.End();
}
建议使用NPOI
有保护限制吧,不允许直接访问客户端桌面这种
一般是导出提示下载!
web不能直接访问本机桌面路径的!你在本机调试成功,是因为你本机等于服务器。而当你上传到服务器上,你的代码访问的是服务器的桌面,而不是你电脑的桌面。你本机对网站的权限肯定没有做什么设置,所以可以生成到桌面,而你服务器上肯定对web权限有很高的要求和限制,所以……
解决方法:生成excel文件在网站的某个文件夹,比如:/upload/excel/xxxxxxx.xls
然后在页面上显示一个下载链接:<a href="/upload/excel/xxxxxxx.xls">点击下载</a>
让用户自己点击下载。然后网站的运营者定期清理这些excel文件,或者后台写个管理这些文件的功能。
这种, 你在本机上也应该是点击后出现下载才算成功.
而不是直接到桌面上了