今天在写项目时写到一个excel的导出,开始想用ajax请求后台后导出,但发现ajax会有返回值,而且ajax无法直接输出文件,而后台的excel导出方法已经封装好,不方便修改。
就改用了提交的方式form,但form提交,表格分页用的是jquerytable,我需要将一些jquerytable的一些参数传到后台,但这些数据已经是json数据,如果我直接放在input中提交到后台在解析参数会很麻烦,所以就想将json数据转为form方式提交。
//导出
function exportExcel() {
var url = "List.aspx?method=ExportInfo";
$("#exportForm").attr("action", url);
//清空表单
$("#exportForm").html("");
//将json数据转为form表单形式
$.each(tableData, function (i, obj) {
$("#exportForm").append("<input type='hidden' name='" + obj.name + "' value='" + obj.value + "' />");
exportForm.submit();
后台(这里我就可以直接使用开始的分页数据不需要再进行过多处理(只需固定页显示总数和,当前页面))
public void ExportInfo()
//需要对前台参数进行赋值
ClassParameter param = new ClassParameter();
param.iDisplayLength = int.Parse(Request.Form["iDisplayLength"]);
param.iDisplayStart = int.Parse(Request.Form["iDisplayStart"]);
param.iColumns = int.Parse(Request.Form["iColumns"]);
param.iSortingCols = int.Parse(Request.Form["iSortingCols"]);
param.sColumns = Request.Form["sColumns"];
//查询条件
param.SelectStr = Request.Form["SelectStr"];
param.Specialty = string.IsNullOrEmpty(Request.Form["Specialty"]) ? Guid.Empty : new Guid(Request.Form["Specialty"]);
param.StartTime = Request.Form["StartTime"];
param.State = string.IsNullOrEmpty(Request.Form["State"]) ? CommonConts.INTZERO : int.Parse(Request.Form["State"]);
param.GetOrderExpression(Request);
DataTableResult<List<P_ClassInfoVO>> result = P_ClassManage.Page(param);
Export(result.aaData);//导出方法
/// <summary>
/// 导出excel
/// </summary>
/// <param name="classList"></param>
private void Export(List<P_ClassInfoVO> classList)
//判读是否为空
if (classList.Count == 0)
return;
//实例化一个 workbook
Workbook workbook = new Workbook();
//打开模板(在服务器上)
string path = System.Web.HttpContext.Current.Server.MapPath("~");
path = path.Substring(0, path.LastIndexOf("\\"));
path += @"\file\ExcelTemplate\班级信息表.xlsx";
workbook.Open(path);
int rows = classList.Count;
int index = 4;
int i = 1;
//获得一个worksheet
Worksheet master = workbook.Worksheets[0];
workbook.Worksheets.Add("班级信息");
Worksheet sheet = workbook.Worksheets["班级信息"];
sheet.Copy(master);
foreach (P_ClassInfoVO item in classList)
Cells cells = sheet.Cells;
//表格内容填写
cells["A" + index.ToString()].PutValue(i++);
cells["B" + index.ToString()].PutValue(item.C_Name);
cells["C" + index.ToString()].PutValue(item.C_Code);
cells["D" + index.ToString()].PutValue(item.Sp_Name);
cells["E" + index.ToString()].PutValue(item.C_StartClassTime);
cells["F" + index.ToString()].PutValue(item.C_CloseClassTime);
cells["G" + index.ToString()].PutValue(item.C_StudyLength);
cells["H" + index.ToString()].PutValue(item.T_Name);
cells["I" + index.ToString()].PutValue(item.C_StateStr);
cells["J" + index.ToString()].PutValue(item.C_Other);
index++;
workbook.Worksheets.RemoveAt(0);
Random rd = new Random();
string fileName = "班级信息" + DateTime.Now.ToString("yyyyMMddhhmmss") + rd.Next(10, 100) + ".xls";
//ie需要编码(浏览器内核)
if (Request.UserAgent.ToLower().Contains("trident"))
//保存文件
fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
workbook.Save(fileName, FileFormatType.Excel2003, SaveType.OpenInExcel, System.Web.HttpContext.Current.Response, System.Text.Encoding.UTF8);
HttpContext.Current.ApplicationInstance.CompleteRequest();
catch
finally
GC.Collect();
这样就可以导出了