C# 4.0 我想使用WebGrid将自由格式本机查询输出发送到excel
首先,我需要解释我的问题,我有一个本机查询应用程序,其中有人键入“选择……这个和那个”,输出当前显示在一个分页的网格中,我被要求添加一个按钮,该按钮将数据直接从非类型化的数据流导出到excel。我目前发现的代码使用了网格,出于某种原因,仍然没有提示我下载.xls文件C# 4.0 我想使用WebGrid将自由格式本机查询输出发送到excel,c#-4.0,export-to-excel,C# 4.0,Export To Excel,首先,我需要解释我的问题,我有一个本机查询应用程序,其中有人键入“选择……这个和那个”,输出当前显示在一个分页的网格中,我被要求添加一个按钮,该按钮将数据直接从非类型化的数据流导出到excel。我目前发现的代码使用了网格,出于某种原因,仍然没有提示我下载.xls文件 [Authorize(Roles = "Portal administrator")] public void ExportExcel(NativeQueryVM model, int? page, string
[Authorize(Roles = "Portal administrator")]
public void ExportExcel(NativeQueryVM model, int? page, string sort)
{
List<Dictionary<string, object>> result = null;
String vartimedate = DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss");
try
{
var user = Membership.GetUser();
var grid = new System.Web.UI.WebControls.GridView();
if (page == null && sort == null)
{
if (model.QueryText.ToUpper().StartsWith("SELECT"))
{
UserQueryInput queryinput = new UserQueryInput();
queryinput.DatabaseId = model.selectedDatabase;
queryinput.QueryText = model.QueryText;
result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, queryinput, "Set");
model.QueryResultData = result;
ViewBag.SubmitType = "Select";
CreateDynamicResult(model.QueryResultData);
if (model == null || model.QueryResultData.Count == 0)
{
ViewBag.ResultMessage = "No Results Found";
}
else
{
WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false );
string griddata = wd.GetHtml().ToString();
string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Response.Write(griddata);
Response.End();
}
}
}
else
{ //This part should come when page or sort is not null for Select. Should not be executed other than SELECT
result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, null, "Get");
model.QueryResultData = result;
ViewBag.SubmitType = "Select";
CreateDynamicResult(model.QueryResultData);
if (model == null || model.QueryResultData.Count == 0)
{
ViewBag.ResultMessage = "No Results Found";
}
else
{
}
}
}
catch (Exception ex)
{
logger.Log(new LogMessage()
.ForMethod("SubmitQuery")
.WithContext(Environment.MachineName)
.WithException(ex)
.WithDescription("An error occurred while submiting query to get result"));
}
}
[授权(角色=“门户管理员”)]
public void ExportExcel(NativeQueryVM模型、整型页面、字符串排序)
{
列表结果=空;
字符串vartimedate=DateTime.Now.ToString(“yyyy-dd-M--HH-mm-ss”);
尝试
{
var user=Membership.GetUser();
var grid=new System.Web.UI.WebControls.GridView();
if(page==null&&sort==null)
{
if(model.QueryText.ToUpper().StartsWith(“选择”))
{
UserQueryInput queryinput=新的UserQueryInput();
queryinput.DatabaseId=model.selectedDatabase;
queryinput.QueryText=model.QueryText;
结果=lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey,user.UserName,queryinput,“Set”);
model.QueryResultData=结果;
ViewBag.SubmitType=“选择”;
CreateDynamicResult(model.QueryResultData);
if(model==null | | model.QueryResultData.Count==0)
{
ViewBag.ResultMessage=“未找到结果”;
}
其他的
{
WebGrid wd=新的WebGrid(来源:ViewBag.DynamicResult,canPage:false,canSort:false);
字符串griddata=wd.GetHtml().ToString();
字符串attachment=“attachment;filename=NativeQuery”+vartimedate+“.xls”;
Response.ClearContent();
AddHeader(“内容处置”,附件);
Response.ContentType=“应用程序/excel”;
StringWriter sw=新的StringWriter();
HtmlTextWriter htw=新的HtmlTextWriter(sw);
响应。写入(griddata);
Response.End();
}
}
}
其他的
{//当Select的页或排序不为空时,应出现此部分。除Select外,不应执行其他操作
结果=lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey,user.UserName,null,“Get”);
model.QueryResultData=结果;
ViewBag.SubmitType=“选择”;
CreateDynamicResult(model.QueryResultData);
if(model==null | | model.QueryResultData.Count==0)
{
ViewBag.ResultMessage=“未找到结果”;
}
其他的
{
}
}
}
捕获(例外情况除外)
{
logger.Log(新的LogMessage()
.ForMethod(“提交查询”)
.WithContext(Environment.MachineName)
.除例外(ex)
.WithDescription(“提交查询以获取结果时出错”);
}
}
如何调用此void函数?返回路径包括设置带有错误消息的ViewBag
属性以及修改响应。它有设计不好的味道
我会创建一个超链接,链接到类似这样的@Url.Action
。请注意,您需要返回带有UTF8编码数据的FileContentResult
,而不是直接修改响应
:
public async Task<ActionResult> Test()
{
WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false );
string griddata = wd.GetHtml().ToString();
string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/excel";
byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(griddata);
return File(buffer, "application/octet-stream");
}
公共异步任务测试()
{
WebGrid wd=新的WebGrid(来源:ViewBag.DynamicResult,canPage:false,canSort:false);
字符串griddata=wd.GetHtml().ToString();
字符串attachment=“attachment;filename=NativeQuery”+vartimedate+“.xls”;
Response.ClearContent();
AddHeader(“内容处置”,附件);
Response.ContentType=“应用程序/excel”;
byte[]buffer=System.Text.UTF8Encoding.UTF8.GetBytes(griddata);
返回文件(缓冲区,“应用程序/八位字节流”);
}
大家好,回答了这个问题的所有人,我发现答案和问题都在我输入问题的代码之外。Jquery截取了我的文件流的输出,另一方面,如果按钮是用runat=server创建的,那么模型就超出了范围,解决方案的主要部分是将模型保存到会话并将其拉回来
感谢您的帮助所有…在您的代码中尝试Response.Output.Write(griddata)在您有Response.Write(griddata)的地方。