<经验杂谈>前端form提交导出数据

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

 

posted @   程序玩家  阅读(298)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示