我意识到这个问题已经被问了将近7年,但它仍然是某些关键词在谷歌搜索结果中排名靠前的关于使用C#导入Excel数据的问题,因此我想提供一种基于最新技术发展的替代方法。
导入Excel数据已经成为了我日常工作中如此常见的任务,以至于我已经简化了这个过程并在我的博客上记录了这个方法:使用c#读取excel文件的最佳方法。
我使用NPOI,因为它可以在没有安装Microsoft Office的情况下读写Excel文件,并且它不使用COM+或任何互操作。这意味着它可以在云端工作!
但真正的魔力来自于与NPOI Mapper Donny Tian配对,因为它允许我将Excel列映射到我的C#类属性上,而无需编写任何代码。这真是太棒了。
这里是基本思路:
我创建一个匹配/映射我感兴趣的Excel列的.net类:
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"的原因)。但是,关于如何使用NPOI来保存/修改文件已经有了一个很好的SO讨论:save/modify a file using NPOI。