我意识到这个问题是在将近 7 年前被问到的,但它仍然是关于使用 C# 导入 excel 数据的某些关键字的顶级 Google 搜索结果,所以我想根据最近的一些技术发展提供一个替代方案。
导入 Excel 数据已成为我日常工作中的一项常见任务,我简化了流程并在我的博客上记录了该方法:best way to read excel file in c#。
我使用NPOI是因为它可以在没有安装 Microsoft Office 的情况下读取/写入 Excel 文件,并且它不使用 COM+ 或任何互操作。这意味着它可以在云端工作!
但真正的魔力来自与Donny Tian的 NPOI Mapper 配对,因为它允许我将 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 保存/修改文件已经有了很好的讨论。