首页 新闻 会员 周边

asp.net网站客户端导出excel

0
悬赏园豆:60 [待解决问题]

本机可以导出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");
}
}

爱学习呢的主页 爱学习呢 | 初学一级 | 园豆:146
提问于:2017-02-07 14:07
< >
分享
所有回答(7)
0

要分清楚服务器端和客户端。

在服务器端生成文件流,然后返回,至于保存在什么地方是由用户在客户端决定的。

 

所以你这里的代码是有问题的,一定要理解服务器端和客户端。

ExcelHelper.GridToExcelByNPOI(dt, pathDestop + "\\" + "月度奖励绩效" + DateTime.Now.AddMonths(-1).ToString("yyyy-MM") + ".xls");

这句代码是你自己或者第三方类库吧,我猜应该是在桌面生成一个excel文件。

本机测试你自己可能觉得没毛病,但代码跑在服务器端。

 

return File();才对。  

 

也不知道说清楚没有,加油。

写代码的小2B | 园豆:4371 (老鸟四级) | 2017-02-07 14:56

发布后调试string pathDestop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);获取路径为空,没有导出,该怎么解决导出问题

支持(0) 反对(0) 爱学习呢 | 园豆:146 (初学一级) | 2017-02-07 15:22

@爱学习呢: 

在服务器上是有权限控制的,一般来说在web项目中获取绝对目录需要其他的方式,这样的问题直接百度就可以。

 

点我

支持(0) 反对(0) 写代码的小2B | 园豆:4371 (老鸟四级) | 2017-02-07 15:30
0

da导出到你服务器的桌面了吧.

你先理解下web的导出就是下载

吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-07 14:56

string pathDestop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);获取到的路劲为空,所以也没有导出,麻烦大神说下导出的思路,并提供一些参考代码吧

支持(0) 反对(0) 爱学习呢 | 园豆:146 (初学一级) | 2017-02-07 15:20

@爱学习呢: 这个代码是在服务器执行的明白不.

                

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-02-07 16:11
0

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();
}

apgk | 园豆:47 (初学一级) | 2017-02-14 09:40
0

建议使用NPOI

晓道 | 园豆:297 (菜鸟二级) | 2017-04-11 10:22
0

有保护限制吧,不允许直接访问客户端桌面这种

轶寒 | 园豆:4 (初学一级) | 2017-08-17 15:52

一般是导出提示下载!

支持(0) 反对(0) 轶寒 | 园豆:4 (初学一级) | 2017-08-17 15:53
0

web不能直接访问本机桌面路径的!你在本机调试成功,是因为你本机等于服务器。而当你上传到服务器上,你的代码访问的是服务器的桌面,而不是你电脑的桌面。你本机对网站的权限肯定没有做什么设置,所以可以生成到桌面,而你服务器上肯定对web权限有很高的要求和限制,所以……

解决方法:生成excel文件在网站的某个文件夹,比如:/upload/excel/xxxxxxx.xls

然后在页面上显示一个下载链接:<a href="/upload/excel/xxxxxxx.xls">点击下载</a>

让用户自己点击下载。然后网站的运营者定期清理这些excel文件,或者后台写个管理这些文件的功能。

陈子 | 园豆:241 (菜鸟二级) | 2017-10-11 00:45
0

这种, 你在本机上也应该是点击后出现下载才算成功.
而不是直接到桌面上了

风中的雪糕 | 园豆:418 (菜鸟二级) | 2020-01-21 21:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册