czwartek, 17 grudnia 2009

Parsowanie rekordów Excel'a na zdefiniowane obiekty

Spędziłem ostatnio troche czasu nad importem plików excela. Mozolna praca, zwłaszcza kiedy należy jeszcze przeanalizować zawartość wierszy w kodzie.

Postanowiłem troche uprościć życie, napisałem kilka lini kodu, które automatycznie parsują wiersze excela na obiekty wczesniej przez nas zdefiniowane.

Na poczatke zobaczmy jak budujemy obiekt do reprezentacji wiersza:

Bo stworzeniu klasy dodajemy do niej tyle właściwości ile mamy kolumn do zmapowania z excela i tak dla przykładu:

[MuchSoft.BLL.SqlHelper.DynamicBindingExcelColumn("imie klienta")]
public string ImieKlienta { get; set; }

Definicja atrybutu ktorego uzylem znajduje sie tutaj:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class DynamicBindingExcelColumnAttribute : System.Attribute
{
public string column_name { get; set; }
public bool required_field { get; set; }


public DynamicBindingExcelColumnAttribute()
{
}

public DynamicBindingExcelColumnAttribute(string columnName)
{
column_name = columnName;
required_field = true;
}

public DynamicBindingExcelColumnAttribute(string columnName, bool required)
{
column_name = columnName;
required_field = required;

}
}


Jako parametr atrybutu podajemy nazwe kolumny ktora mamy w excelu do zmapowania w tym przypadku "imie klienta"


W konstruktorze obiektu ktory utworzylismy na potrzeby mapowania rekordow odpalamy metode parsujaca:
MuchSoft.BLL.SqlHelper.DynamicBindingDataManager.BindPropertiesFromExcel(this, dr, "");

Tutaj wchodza nam trzy parametry this - reprezentuje obiekt ktory mapujemy, dr to wiersz z excela

Teraz slow kilka o samej metodzie parsujacej

Deklaracja
static public object BindPropertiesFromExcel(object o, DataRow reader, string columnList)


Podciagniecie wlasciwosci oraz zbudowanie listy kolumn
PropertyInfo[] pri = o.GetType().GetProperties();

List _columns = new List();

foreach (string s in columnList.Split(','))
{
if (s.Length > 0)
_columns.Add(s);
}


Przeglad wlasciwosci i podpiecie do nich wartosci
foreach (PropertyInfo p in pri)
{
try
{
object[] attributes = p.GetCustomAttributes(false);

if (attributes.Length > 0 && attributes.GetValue(0).GetType().Name == "DynamicBindingExcelColumnAttribute")
{
Type t = o.GetType();
PropertyInfo pi = t.GetProperty(p.Name);
DynamicBindingExcelColumnAttribute atr = (DynamicBindingExcelColumnAttribute)attributes.GetValue(0);
string columnName = atr.column_name == null ? p.Name : atr.column_name;


if ((_columns.Count > 0 && _columns.Contains(columnName)) || _columns.Count == 0)
{
if (pi.PropertyType.FullName == typeof(int).FullName)
pi.SetValue(o, int.Parse(reader[columnName].ToString()), null);
else if (pi.PropertyType.FullName == typeof(string).FullName)
pi.SetValue(o, reader[columnName].ToString().Trim(), null);
else if (pi.PropertyType.FullName == typeof(decimal).FullName)
pi.SetValue(o, decimal.Parse(reader[columnName].ToString()), null);
}
}
}
catch (Exception e)
{
return e;
}
}

return o;


I finito.

Brak komentarzy:

Prześlij komentarz