我意识到这个问题是在将近7年前提出的,但是对于某些有关使用C#导入excel数据的关键字,它仍然是Google排名最高的搜索结果,因此我想根据最近的一些技术发展提供一个替代方法。
导入Excel数据已成为我日常工作中的一项常见任务,因此我简化了流程并在博客上记录了该方法:在c#中读取excel文件的最佳方法。
我使用NPOI是因为它可以在未安装Microsoft Office的情况下读取/写入Excel文件,并且不使用COM +或任何互操作性。这意味着它可以在云中工作!
但是真正的魔力来自与Donny Tian的NPOI Mapper的配对,因为它使我无需编写任何代码即可将Excel列映射到C#类中的属性。真漂亮。
这是基本思想:
我创建一个.net类来匹配/映射我感兴趣的Excel列:
class CustomExcelFormat
{
[Column("District")]
public int District { get; set; }
[Column("DM")]
public string FullName { get; set; }
[Column("Email Address")]
public string EmailAddress { get; set; }
[Column("Username")]
public string Username { get; set; }
public string FirstName
{
get
{
return Username.Split('.')[0];
}
}
public string LastName
{
get
{
return Username.Split('.')[1];
}
}
}
注意,如果需要的话,它允许我基于列名进行映射!
然后,当我处理excel文件时,我需要做的就是这样:
public void Execute(string localPath, int sheetIndex)
{
IWorkbook workbook;
using (FileStream file = new FileStream(localPath, FileMode.Open, FileAccess.Read))
{
workbook = WorkbookFactory.Create(file);
}
var importer = new Mapper(workbook);
var items = importer.Take<CustomExcelFormat>(sheetIndex);
foreach(var item in items)
{
var row = item.Value;
if (string.IsNullOrEmpty(row.EmailAddress))
continue;
UpdateUser(row);
}
DataContext.SaveChanges();
}
现在,坦率地说,我的代码不会修改Excel文件本身。我改为使用Entity Framework将数据保存到数据库中(这就是为什么在我的示例中看到“ UpdateUser”和“ SaveChanges”的原因)。但是,关于SO如何使用NPOI保存/修改文件已经有很好的讨论。