最近做excel导入导出的功能,下面是一些代码笔记。使用的是EPPlus
对于全string型的自动转换可以采用AutoMapper。简单也方便理解。需要注意的是XExcelModel, XItem的命名需要保证一定的相似性
public static class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile(new ModelProfile());
});
}
}
// 继承AutoMapper.Profile
public class ModelProfile : Profile
{
protected override void Configure()
{
// 类型转换
CreateMap<string, Type>().ConvertUsing(new StringTypeConverter());
CreateMap<string, int>().ConvertUsing(new StringIntConverter());
// XExcelModel -> XItem转换
CreateMap<XExcelModel, XItem>();
// XItem -> XExcelModel转换
CreateMap<XItem, XExcelModel>();
}
}
public class StringTypeConverter : ITypeConverter<string, Type>
{
public Type Convert(string source, ResolutionContext context)
{
return Type.GetType(source);
}
}
public class StringIntConverter : ITypeConverter<string, int>
{
public int Convert(string source, ResolutionContext context)
{
int value;
var result = Int32.TryParse(source, out value);
return result ? value : default(int);
}
}
// 调用
public void Test()
{
AutoMapperConfiguration.Configure();
var excelRecords = Mapper.Map<List<XItem>, List<XExcelModel>>(entities);
}
获取工程目录里的文件
var myAssembly = Assembly.GetExecutingAssembly();
Stream stream = myAssembly.GetManifestResourceStream("工程名.XXX.XXX.文件名");
读excel到model里时的类型处理
private static T ConvertToObject<T>(List<string> columnValues, List<string> rowCellValues)
{
T obj = Activator.CreateInstance<T>();
foreach (PropertyInfo pi in obj.GetType().GetProperties())
{
for (int index = 0; index < columnValues.Count; index++)
{
var displayName = TypeExtensions.GetDisplayName(typeof(T), pi.Name);
if (displayName.Equals(columnValues[index], StringComparison.OrdinalIgnoreCase))
{
String propertyType = pi.PropertyType.Name;
switch (propertyType)
{
case "Int32":
pi.SetValue(obj, int.Parse(rowCellValues[index]), null);
break;
case "DateTime":
pi.SetValue(obj, DateTime.Parse(rowCellValues[index]), null);
break;
case "Decimal":
pi.SetValue(obj, Decimal.Parse(rowCellValues[index]), null);
break;
case "Double":
pi.SetValue(obj, Double.Parse(rowCellValues[index]), null);
break;
case "String":
pi.SetValue(obj, rowCellValues[index], null);
break;
case "Boolean":
pi.SetValue(obj, Boolean.Parse(rowCellValues[index]), null);
break;
}
break;
}
}
}
return obj;
}