首页 > 技术文章 > <经验杂谈>前端form提交导出数据

benpao 2017-09-01 15:14 原文

之前在做列表的是总会遇到一些导出的功能,而在做导出的时候总是习惯于用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;
        }

 

推荐阅读