我们有一些代码可以将数据从数据库导出到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
所以,上面是模型。 Birthday
和Meeting
继承自Event
,所有Event
个对象都有EventDate
个对象列表。每个EventDate
对象都有一个开始日期,结束日期和Location
个对象列表。
我们的目标是找到一种动态方法,将数据从数据库传输到Excel文档。我们宁愿不在数据库中维护大量的视图(因为我们最终会添加更多的事件类型)。
我并不熟悉.NET的XML功能,但我们现在使用的解决方案使用的是OpenXML,代码也很有意义。
非常感谢您的意见和可能的解决方案
答案 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();
}
}