本帖最后由 小白来袭2 于 2021-8-6 19:25 编辑
项目经理昨天给我打电话,让我搞个excel转实体类,把数据存入数据库。我想“这玩意不是百度都有吗?”,所以先在百度搞了一个应付了一下!
项目经理:太啰嗦了,还没办法通用 ,重新搞一个通用的
我:.........,*******
mmp 搞就搞
[C#] 纯文本查看 复制代码 /// <summary>
/// 工作区转集合
/// </summary>
/// <param name="worksheet">工作区</param>
/// <param name="filestream">工作区序号</param>
/// <param name="openrow">开始行</param>
/// <param name="opencol">开始列</param>
/// <param name="endcol">结束列</param>
/// <param name="endrow">结束行 默认全文</param>
/// <returns></returns>
public static List<T> WorksheetToDataRow<T>(Stream filestream,int worksheetindex, int openrow, int opencol, int endcol, int endrow = 0)
{
try
{
//判断文件是否为空
if (filestream.Length < 1)
{
throw new Exception("文件不能为空");
}
//读取文件流
ExcelPackage package = new ExcelPackage(filestream);
//获取sheet表
ExcelWorksheets worksheets = package.Workbook.Worksheets;
ExcelWorksheet worksheet = worksheets[worksheetindex];
if (endrow == 0)
{
endrow = worksheet.Dimension.End.Row;
}
var ty = typeof(T);
var properlist = ty.GetProperties();
//查询带有excel特性的属性
var excelproperlist = properlist.Where(o => o.GetCustomAttributesData().Where(o => o.AttributeType == typeof(ExcelToEntityAttribute)).Count() > 0).ToList();
var requestlist = new List<T>();
int entityidx = 0;
for (int i = openrow; i <= endrow; i++)
{
var good = Activator.CreateInstance<T>();
for (int j = opencol; j <= endcol; j++)
{
var value = worksheet.Cells[i, j].Value;
Type valueType = excelproperlist[entityidx ].PropertyType;
if (valueType.IsEnum)
{
if (!Enum.TryParse(valueType, value.ToString(), out value))
{
throw new Exception("枚举数据无法转移") ;
}
}
else
{
value= Convert.ChangeType(value, valueType);
}
if (value != null)
{
excelproperlist[entityidx ].SetValue(good, value);
}
entityidx ++;
}
requestlist.Add(good);
}
package.Dispose();
return requestlist;
}
catch (Exception ex)
{
throw ex;
}
}
到这里还没完,还差最重要的一步,就是让程序知道我的那些属性是要用来填充的
[C#] 纯文本查看 复制代码 /// <summary>
/// 产品编号
/// </summary>
[ExcelToEntity]
public string GoodsNo { get; set; }
/// <summary>
/// 产品名称
/// </summary>
[ExcelToEntity]
public string GoodsName { get; set; }
/// <summary>
/// 产品型号
/// </summary>
[ExcelToEntity]
public string GoodsModel { get; set; }
这里使用c#的自定义特性
[C#] 纯文本查看 复制代码 /// <summary>
/// 自定义特性
/// </summary>
public class ExcelToEntityAttribute :System.Attribute
{
}
到这里整个转换就完成了,理论上可以完成任何类型的转换,不用在自己指定第几格是啥类型
这个东西看上去还可以,但是有个问题,那就是必须要在excel中的列排布要和类中属性的排布相同 说句人话就是:不能改excel中列代表的意思
但是个人感觉还有很大改进空间,这种给项目经理应该没啥问题了
使用效果:
|