c#导出Excel

问题:用户查询一些数据,需要对页面上的数据生成excel文件。

分析:写文件,用excel进程,或者使用response方法(都是通过网上查资料,个人就理解成这两个)

   使用excel进程有一个确定,就是程序代码是在服务器上的,如果服务器上没有装excel,那么问题无法解决;就算装了,但是导出的文件

  还是在服务器上,无法(相对来说)传到客户端。那么就使用response方法了。

 

具体实现:以下的东东,都是自己查阅大量网上资料,和自己总结。

首先,对于从数据库取出的数据,结果放在list中,然后调用下面方法,这个方法主要是控制excel中显示的格式以及内容。

  public void exportExcel(List<ArchivedWcsTask> wcstask, List<ArchivedMovement> movement,string title)
        {
            //接收需要导出的数据
             

            //命名导出表格的StringBuilder变量
            StringBuilder sHtml = new StringBuilder(string.Empty);

            //打印表头
            sHtml.Append("<table border=\"1\" width=\"100%\">");
            sHtml.Append("<tr height=\"40\"><td colspan=\"6\" align=\"center\" style='font-size:24px'><b>" + title + "</b></td></tr>");

            //打印列名
            sHtml.Append("<tr height=\"20\" align=\"center\" ><td>任务号</td><td>条码号</td><td>起点</td><td>终点</td><td>创建时间</td><td>任务</td></tr>");

            //循环读取List集合 
            for (int i = 0; i < wcstask.Count; i++)
            {
                sHtml.Append("<tr height=\"20\" align=\"left\"><td>"+ wcstask[i].TaskCode  
                    + "</td><td>" + wcstask[i].ContainerCodes
                    + "</td><td>"  + wcstask[i].StartLocation
                    + "</td><td>" + wcstask[i].EndLocation
                     + "</td><td>" + wcstask[i].CompletedAt.ToString() 
                     + "</td><td>"+ movement.Single(x => x.Id == wcstask[i].MovementId).Tag 
                     + "</td></tr>");
            }

            sHtml.Append("</table>");
            string fileName = DateTime.Parse(wcstask.FirstOrDefault().CompletedAt.ToString()).ToString("yyyyMMddHHmmss") + ".xls";
            //调用输出Excel表的方法
            ExportToExcel("application/ms-excel", fileName, sHtml.ToString());
        }

上面的那个ExportToExcel("application/ms-excel", fileName, sHtml.ToString()),这个方法才是调用response导出excel。

 

  public void ExportToExcel(string FileType, string FileName, string ExcelContent)
        {
            System.Web.HttpContext.Current.Response.Charset = "UTF-8";
            System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8).ToString());
            System.Web.HttpContext.Current.Response.ContentType = FileType;
            System.IO.StringWriter tw = new System.IO.StringWriter();
            System.Web.HttpContext.Current.Response.Output.Write(ExcelContent.ToString());
            System.Web.HttpContext.Current.Response.Flush();
            System.Web.HttpContext.Current.Response.End();
        }

 

 

 

至此,导出excel已经完成。

实例:这是一个页面的GET方法,由于是业务的需求,不得不用GET,一般情况用POST方法要好点。。。

 

     [HttpGet]
        [OpenSessionInViewFilter]
        public ActionResult ExportHistoryTask(string taskcode, string containercode, string taskStartLoc, string taskEndLoc, DateTime? startTime, DateTime? endTime)
        {
            Wms.WmsRepositories repositories = OpenSessionInViewFilterAttribute.Current.WmsRepositories;
            if (endTime != null)
            {
                endTime = endTime.Value.Date.AddDays(1.0);

            }
            var list = repositories.WcsTaskRepository.GetHistoryTasks(taskcode, containercode, taskStartLoc, taskEndLoc, startTime, endTime);
            List<ArchivedMovement> temp = repositories.MovementRepository.GetHistoryMovement(list);

            if (list.Count <= 0)
            {
                ViewBag.msg = "结果为空,无法导出";
                return View();
            }

            string title = "您导出条件为:";
            title += (string.IsNullOrEmpty(taskcode) == true) ? "" : "任务号:" + taskcode;
            title += (string.IsNullOrEmpty(containercode) == true) ? "" : "条码号:" + containercode;
            title += (string.IsNullOrEmpty(taskStartLoc) == true) ? "" : "起点:" + taskStartLoc;
            title += ((string.IsNullOrEmpty(taskEndLoc)) == true) ? "" : "终点:" + taskEndLoc; ;
            title += ((string.IsNullOrEmpty(startTime.ToString())) == true) ? "" : "时间范围:" + startTime.ToString();
            title += ((string.IsNullOrEmpty(endTime.ToString())) == true) ? "-" : "----" + endTime.ToString();

            exportExcel(list, temp, title);
            ViewBag.msg = "导出成功!";
            //    return View();
            return View();
        }

 

 

上面那个界面的代码:

 

@{
    Layout = null;
    }
    正在导出中。。。

 

调用这个界面的代码:

<script type="text/javascript" src="/Scripts/DatePicker/WdatePicker.js"></script>
@*<script src="/Scripts/jquery-1.8.3.min.js" type="text/javascript"></script>*@
<script type="text/javascript">
    $(document).ready(function () {
        $("a").click(function () {
            var taskcode = $("#taskcode").val();
            var containercode = $("#containercode").val();
            var taskStartLoc = $("#taskStartLoc").val();
            var taskEndLoc = $("#taskEndLoc").val();
            var starttime = $("#starttime").val();
            var endtime = $("#endtime").val();
      
            $(this).attr("href", "/TaskView/ExportHistoryTask?taskcode=" + taskcode
            + "&containercode=" + containercode + "&taskStartLoc=" + taskStartLoc
            + "&taskEndLoc=" + taskEndLoc + "&startTime=" + starttime + "&endTime=" + endtime);

        });

    });
</script>
@using (Ajax.BeginForm("HistoryView", null, new AjaxOptions { UpdateTargetId = "list", LoadingElementId = "loading_img", OnBegin = "onListLoadBegin", OnFailure = "onListLoadFailure", OnSuccess = "onListLoadSuccess" }, new { id = "spec_form" }))
{
    <div id="index">
        <span>任务号:</span><span><input type="text" id="taskcode" name="taskcode" /></span>
        <span>条码号:</span><span><input type="text" id="containercode" name="containercode" /></span>
        <span>任务起点:</span><span><input type="text" id="taskStartLoc" name="taskStartLoc" /></span>
        <span>任务终点:</span><span><input type="text" id="taskEndLoc" name="taskEndLoc" /></span>
        <span>时间起点</span><span><input type="text" id="starttime" name="startTime" class="Wdate"
            onclick="WdatePicker({skin:'whyGreen'})" /></span> 
        <span>时间终点</span><span><input
                type="text" id="endtime" name="endTime" class="Wdate" onclick="WdatePicker({skin:'whyGreen'})" /></span>
        <input type="submit" value="查询" />
        <input type="reset" value="重置" />
        <input type="hidden" id="pageIndex" name="pageIndex" value="1" />
    </div>
}
<div id="list" style="margin: 20px;">
</div>

<a>导出历史任务表</a>
<img style="display:none; " id="loading_img" src="@Url.Content("~/Content/loading.gif")" alt="loading" />
@Html.Partial("IndexJs")

 

posted @ 2013-07-12 19:02  shenghaishiweini  阅读(277)  评论(0编辑  收藏  举报