博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC中FileResult 返回类型返回Excel
阅读量:6296 次
发布时间:2019-06-22

本文共 10909 字,大约阅读时间需要 36 分钟。

公司中以前写的导出有问题。原来使用的XML格式字符串拼接然后转化成流输出

action

public FileResult ExportJobFair()        {            try            {                string name = "t";                int lblx = int.Parse(Request.QueryString["LBLX"]);                string filename = name + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";                byte[] excelbyte = new RecruitmentMeeting().ExportJobFair(Request.QueryString["LBLX"]);                return File(excelbyte, @"application/ms-excel", filename);            }            catch (Exception)            {                return null;            }        }

XML字符串拼接

public byte[] ExportJobFair(string lblx)        {            try            {                //生成execl                string name = "招聘会列表";                string muban1 = "
User
User
2017-01-12T03:15:00Z
2017-01-12T03:46:32Z
2052-10.1.0.6135
28695
13050
False
False
" + name + "
招聘会名称
申请截止时间
开始时间
结束时间
地点
"; string muban2 = ""; string muban3 = "
0
0
100
3
0
0
R1C1:R2C3
False
False
0
0
100
False
False
"; if (int.Parse(lblx) == 4) { muban2 = "
" + name + "
招聘会名称
空余展位/总展位数
申请截止时间
开始时间
结束时间
"; }           //查询类型 ZphListParam cs = new ZphListParam(); cs.MYHS = 0; cs.YM = 0; cs.LBLX = lblx; cs.PXFS = "ASC"; cs.PXZD = "DHMC"; ProcessResult pro = new RecruitmentMeeting().Query(cs); 查询结果列表对象 ZPH = JsonHelper.JsonDeserialize
<查询结果列表对象>
(pro.ResultJson); IList
rows = ZPH.Result.rows; if (ZPH.IsOK == true && rows.Count > 0) { //序号 for (int i = 0; i < rows.Count; i++) { muban2 += "
" + Common.DecodeString(rows[i].DHMC) + "
"; if (int.Parse(lblx) == 4) { muban2 += "
" + rows[i].KYZW + "/" + rows[i].ZZWS + "
"; //muban2 += "
" + rows[i].SQJSSJ + "
"; muban2 += "
" + rows[i].KSSJ + "
"; muban2 += "
" + rows[i].JSSJ + "
"; } else { //muban2 += "
" + rows[i].SQJSSJ + "
"; muban2 += "
" + rows[i].KSSJ + "
"; muban2 += "
" + rows[i].JSSJ + "
"; muban2 += "
" + Common.DecodeString(rows[i].DZ) + "
"; } } } string xmldata = muban1 + muban2 + muban3; byte[] xmlbytes = Encoding.Default.GetBytes(xmldata); return xmlbytes; } catch (Exception) { return null; } }

数据库语句执行完返回的数据类型

public class ProcessResult    {        ///         /// 调用是否成功        ///         public Boolean IsOK { get; set; }        ///         /// 调用是否成功的文字描述        ///         public String Message { get; set; }        ///         /// 调用返回对象        ///         public Object ResultObj { get; set; }        ///         /// 调用返回值的JSON表示        ///         public String ResultJson { get; set; }        ///         /// 获取与设置表格字段名        ///         public string[] Head { get; set; }        ///         /// 表格标题        ///         public string[] HeadText { get; set; }        ///         /// 标题列宽        ///         public int[] HeadWidth { get; set; }        ///         /// 调用受影响的数据行数        /// 对于查询语句,返回符合查询条件的总行数        /// 对于修改语句,返回被更新的数据的总行数        ///         public int RowCount { get; set; }        public int Total { get; set; }        ///         /// 构造函数        ///         /// 调用是否成功        /// 调用是否成功的文字描述        /// 调用返回对象        /// 调用返回值的JSON表示        /// 调用受影响的数据行数        public ProcessResult(bool ok, string msg, object obj, string json, int count)        {            IsOK = ok;            Message = msg;            ResultObj = obj;            ResultJson = json;            RowCount = count;        }        public ProcessResult()        {        }    }

然后发现生成的XML返回EXCEL 程序不认,office excel和WPS均无法打开。提示文件损坏,只能选择重写

因为涉及的地方比较多,时间也比较充裕于是写了一个简单是帮助类

(提示:项目需要引用 Microsoft.Office.Interop)

using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Reflection;namespace Utility{    public class ExcelHelper    {        ///         /// DataTable导出excel        /// 返回保存的地址        ///         /// 数据源        /// 保存路径        /// 
public static string DataTableToExcel(DataTable datas, string p) { Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); try { app.Visible = false; Microsoft.Office.Interop.Excel.Workbook wBook = app.Workbooks.Add(true); Microsoft.Office.Interop.Excel.Worksheet wSheet = wBook.Sheets[1]; wSheet.Name = "shhel"; if (datas.Rows.Count > 0) { int row = datas.Rows.Count; int col = datas.Columns.Count; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { string str = "-"; if (datas.Rows[i][j].Equals(float.NaN) == false) { str = datas.Rows[i][j].ToString(); } wSheet.Cells[i + 2, j + 1] = str; } } } int size = datas.Columns.Count; for (int i = 0; i < size; i++) { wSheet.Cells[1, 1 + i] = datas.Columns[i].ColumnName; } //列自适应 wSheet.Columns.EntireColumn.AutoFit(); //设置禁止弹出保存和覆盖的询问提示框 app.DisplayAlerts = false; app.AlertBeforeOverwriting = false; //保存工作簿 //wBook.Save(); wSheet.SaveAs(p); wBook.Close(); //保存excel文件 //app.Save(filePath); //app.SaveWorkspace(filePath); app.Quit(); GC.Collect(); } catch (Exception) { //强制结束excel进程 IntPtr t = new IntPtr(app.Hwnd); } return p; } /// /// 泛型集合转DataTable /// ///
/// ///
public static DataTable ToDataTable
(IList
items) { if (items==null) { return null; } var tb = new DataTable(typeof(T).Name); PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in props) { tb.Columns.Add(prop.Name); } foreach (T item in items) { var values = new object[props.Length]; for (int i = 0; i < props.Length; i++) { values[i] = props[i].GetValue(item, null); } tb.Rows.Add(values); } return tb; } }}

写好后的Action调用

public FileResult ExportJobFairExcel()        {            try            {                string name = "招聘会列表";                int lblx = int.Parse(Request.QueryString["LBLX"]);                string filename = name + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";                DataTable dt = new RecruitmentMeeting().ExportJobFairDatatable(Request.QueryString["LBLX"]);                string strdate = DateTime.Now.ToString("yyyyMMddhhmmss");                string str = Server.HtmlEncode(Request.PhysicalApplicationPath).ToString() + "File\\Excel\\" + filename;                string file = Utility.ExcelHelper.DataTableToExcel(dt, str);                return File(file, "application/vnd.ms-excel", filename);            }            catch (Exception)            {                return null;            }        }

其中时间格式算个坑吧,第一次导出的时候时间无转换,导出的excel打开时间的列都是#####,

public DataTable ExportJobFairDatatable(string lblx)        {            try            {                //生成execl                string name = "招聘会列表";                ZphListParam cs = new ZphListParam();                cs.MYHS = 0;                cs.YM = 0;                cs.LBLX = lblx;                cs.PXFS = "ASC";                cs.PXZD = "DHMC";                ProcessResult pro = new RecruitmentMeeting().Query(cs);                招聘会查询结果列表对象 ZPH = JsonHelper.JsonDeserialize
<招聘会查询结果列表对象>
(pro.ResultJson); IList
rows = new List
(); foreach (ZhaopinhuiJson4Query item in ZPH.Result.rows) { JobFair jf = new JobFair();             //Common.DecodeString方法是用于加密后的数据解码的 jf.招聘会名称 = Common.DecodeString(item.DHMC); jf.开始时间 = Convert.ToDateTime(item.KSSJ).Year + "年" + Convert.ToDateTime(item.KSSJ).Month + "月" + Convert.ToDateTime(item.KSSJ).Day + "日"; jf.结束时间 = Convert.ToDateTime(item.JSSJ).Year + "年" + Convert.ToDateTime(item.JSSJ).Month + "月" + Convert.ToDateTime(item.JSSJ).Day + "日"; jf.地点 = Common.DecodeString(item.DZ); rows.Add(jf); } DataTable dt = ExcelHelper.ToDataTable
(rows); if (int.Parse(lblx) == 4) { dt.Columns.Add("空余展位/总展位"); for (int i = 0; i < ZPH.Result.rows.Count; i++) { dt.Rows[i]["空余展位/总展位"] = ZPH.Result.rows[i].KYZW + "/" + ZPH.Result.rows[i].ZZWS; } } return dt; } catch (Exception) { return null; } }
///     /// 公共招聘会导出模型    ///     public class JobFair    {        ///         /// 招聘会名称        /// 使用前需解码        ///         public string 招聘会名称 { get; set; }        ///         /// 开始时间        /// yyyy-MM-dd HH:mm:ss        ///         public string 开始时间 { get; set; }        ///         /// 结束时间        /// yyyy-MM-dd HH:mm:ss        ///         public string 结束时间 { get; set; }        ///         /// 地址        /// 使用前需解码        ///         public string 地点 { get; set; }    }

实际上如果直接用datatable会更快一点,但是因为其他地方也用到了所以为了节约时间直接进行了2次转换。

如果有需要的可以直接把导出的excel文件的方法重载一下。

转载于:https://www.cnblogs.com/SakugamiTomoyo/p/9070521.html

你可能感兴趣的文章
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>