Linq查询excel导出

时间:2017-10-25 07:34:47

标签: c# asp.net linq

我有一个应用程序,我使用LINQ在网格视图中加载数据。它有大约200万条记录。为了加载gridview,我能够在gridview中显示数据,但我需要有他们的导出功能。为此,我使用LINQ跳过并采用LINQ查询等过程来批量获取数据。

之后,我正在将LINQ查询转换为数据表,然后进行导出。

以下是将linq查询转换为datatable的代码:

 public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
{
            DataTable dtReturn = new DataTable();

            // column names 
            PropertyInfo[] oProps = null;

            if (varlist == null) return dtReturn;

            foreach (T rec in varlist)
            {
                // Use reflection to get property names, to create table, Only first time, others will follow 
                if (oProps == null)
                {
                    oProps = ((Type)rec.GetType()).GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                    (rec, null);
                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

之后的导出代码如下:

private void ExportToExcel(DataTable dt)
{
                try
                {
                    Response.ClearContent();
                    Response.Buffer = true;
                    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "CustomReport.xls"));
                    Response.ContentType = "application/ms-excel";
                    string str = string.Empty;
                    foreach (DataColumn dtcol in dt.Columns)
                    {
                        Response.Write(str + dtcol.ColumnName);
                        str = "\t";
                    }
                    Response.Write("\n");
                    foreach (DataRow dr in dt.Rows)
                    {
                        str = "";
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            Response.Write(str + Convert.ToString(dr[j]).Replace("\r\n", string.Empty).Trim());
                            str = "\t";
                        }
                        Response.Write("\n");
                    }
                    Response.End();
                }
                catch (Exception ex)
                {

                }
            }

这里的问题如果我按批次导出就像500 000条记录然后两次我能够导出但是当进行第三次500k记录导出然后在 linqToDataTable中出现内存异常方法。

在没有内存不足的情况下,还有其他简单的导出方法吗?

0 个答案:

没有答案