将iQueryable复杂对象导出到Excel

时间:2010-10-06 19:25:06

标签: c# asp.net asp.net-mvc excel

我们有一些代码可以将数据从数据库导出到Excel,而且效果很好。

主要问题是我们使用数据库视图来收集所有数据。这会产生一个具有相当大视图的问题,因为我们有多种类型的对象可供我们导出。

class Event
  int id
  string title
  List<EventDate> Dates
  string desc

class EventDate
  DateTime start
  DateTime end
  List<EventLocation> Locations

class EventLocation
  string address
  string city
  string zip

class Birthday : Event
  int balloonsOrdered
  string cakeText

class Meeting : Event
  string Organizer
  string Topic

所以,上面是模型。 BirthdayMeeting继承自Event,所有Event个对象都有EventDate个对象列表。每个EventDate对象都有一个开始日期,结束日期和Location个对象列表。

我们的目标是找到一种动态方法,将数据从数据库传输到Excel文档。我们宁愿不在数据库中维护大量的视图(因为我们最终会添加更多的事件类型)。

我并不熟悉.NET的XML功能,但我们现在使用的解决方案使用的是OpenXML,代码也很有意义。

非常感谢您的意见和可能的解决方案

1 个答案:

答案 0 :(得分:3)

您可以使用CSV和以下代码创建List<T>文件:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Web;

public static void CreateCSV<T>(List<T> list, string csvNameWithExt)
{
    if (list == null || list.Count == 0) return;

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.AddHeader(
        "content-disposition", string.Format("attachment; filename={0}", csvNameWithExt));
    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

    //get type from 0th member
    Type t = list[0].GetType();
    string newLine = Environment.NewLine;

    using (StringWriter sw = new StringWriter())
    {
        //gets all properties
        PropertyInfo[] props = t.GetProperties();

        //this is the header row
        //foreach of the properties in class above, write out properties
        foreach (PropertyInfo pi in props)
        {
            sw.Write(pi.Name.ToUpper() + ",");
        }
        sw.Write(newLine);

        //this acts as datarow
        foreach (T item in list)
        {
            //this acts as datacolumn
            foreach (PropertyInfo Column in props)
            {
                //this is the row+col intersection (the value)
                string value = item.GetType().GetProperty(Column.Name).GetValue(item, null).ToString();
                if (value.Contains(","))
                {
                    value = "\"" + value + "\"";
                }
                sw.Write(value + ",");
            }
            sw.Write(newLine);
        }

        //  render the htmlwriter into the response
        HttpContext.Current.Response.Write(sw.ToString());
        HttpContext.Current.Response.End();
    }
}