之前在做列表的是总会遇到一些导出的功能,而在做导出的时候总是习惯于用get的方法将参数放在url上,这样一来就会有很多的弊端,一是url的参数长度有限,遇到有的参数很长的时候就会报错,二是也不太安全。
按照之前写法:
var url = '@Url.Action("")'; window.open(url, "_blank");
现在改成前端form提交的方式:
function doExport() { getCards(); var element = '<form action="'+url+" target="_self" method="post">' + '<input type="text" name="StartDate" value="' + vm.searchReportParam.StartDate + '" />' + '<input type="text" name="EndDate" value="' + vm.searchReportParam.EndDate + '" />' + '<input type="text" name="CardIdsStr" value="' + vm.CardIdsStr + '" />' + '</form>'; $(element).appendTo('body').submit().remove(); };
后端数据处理:
public static void ToExcel<T>(List<T> datas, int SheetRows, string exportName, HttpResponseBase response) { AppLibrary.WriteExcel.XlsDocument doc = new AppLibrary.WriteExcel.XlsDocument(); doc.FileName = exportName + ".xls"; string SheetName = string.Empty; //记录条数 int mCount = datas.Count; //每个SHEET的数量 int inv = SheetRows; //计算当前多少个SHEET int k = Convert.ToInt32(Math.Round(Convert.ToDouble(mCount / inv))) + 1; Type type = typeof(T); PropertyInfo[] properties = type.GetProperties(); for (int i = 0; i < k; i++) { SheetName = "数据表" + i.ToString(); AppLibrary.WriteExcel.Worksheet sheet = doc.Workbook.Worksheets.Add(SheetName); AppLibrary.WriteExcel.Cells cells = sheet.Cells; //创建列样式创建列时引用 XF cellXF = doc.NewXF(); cellXF.VerticalAlignment = VerticalAlignments.Centered; cellXF.HorizontalAlignment = HorizontalAlignments.Centered; cellXF.Font.FontFamily = FontFamilies.Roman;//设置字体 默认为宋体 for (int ColIndex = 0; ColIndex < properties.Length; ColIndex++) { PropertyInfo property = properties[ColIndex]; ExportAttribute attribute = property.GetCustomAttribute<ExportAttribute>(); if (attribute != null) { cells.Add(1, ColIndex + 1, attribute.Name, cellXF); } } int f = 1; for (int m = i * inv; m < mCount && m < (i + 1) * inv; m++) { f++; for (int CellIndex = 0; CellIndex < properties.Length; CellIndex++) { ExportAttribute attribute = properties[CellIndex].GetCustomAttribute<ExportAttribute>(); if (attribute != null) { object value = properties[CellIndex].GetValue(datas[m]); if (properties[CellIndex].PropertyType == typeof(DateTime)) { value = ((DateTime)value).ToString("yyyy/MM/dd"); } cells.Add(f, CellIndex + 1, value, cellXF); } } } } doc.Send(); response.Flush(); response.End(); }
使用插件NPOI来生成EXCEL:
private static HttpResponseMessage GetExcelResponse(List<T> models) { HSSFWorkbook book = new HSSFWorkbook(); ISheet sheet = book.CreateSheet("Sheet1"); int rowIndex = 0; IRow headRow = sheet.CreateRow(rowIndex++); var headColIndex = 0; headRow.CreateCell(headColIndex++).SetCellValue("rows1"); headRow.CreateCell(headColIndex++).SetCellValue("rows2"); headRow.CreateCell(headColIndex++).SetCellValue("rows3"); headRow.CreateCell(headColIndex++).SetCellValue("rows4"); headRow.CreateCell(headColIndex++).SetCellValue("rows5"); foreach (var model in models) { IRow row = sheet.CreateRow(rowIndex++); var colIndex = 0; row.CreateCell(colIndex++).SetCellValue(model.CardName); row.CreateCell(colIndex++).SetCellValue(model.Code); row.CreateCell(colIndex++).SetCellValue((double)model.ItemPrice); row.CreateCell(colIndex++).SetCellValue((double)model.CostPriceTotal); row.CreateCell(colIndex++).SetCellValue(model.OrderCode); } var ms = new MemoryStream(); book.Write(ms); ms.Position = 0L; HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); ms.Position = 0L; response.Content = new StreamContent(ms); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = $"导出{DateTime.Now.ToString("yyyyMMddHHmmss")}.xls" }; return response; }