Я усвідомлюю, що це запитання було задано майже 7 років тому, але воно все ще є найкращим результатом пошуку Google за певними ключовими словами щодо імпорту даних Excel з C #, тому я хотів запропонувати альтернативу на основі деяких останніх технологічних розробок.
Імпорт даних Excel став настільки звичним завданням для моїх повсякденних обов'язків, що я впорядкував процес і задокументував метод у своєму блозі: найкращий спосіб читати файл Excel у c # .
Я використовую NPOI, оскільки він може читати / писати файли Excel без встановлення Microsoft Office і не використовує COM + або будь-які взаємодії. Це означає, що він може працювати в хмарі!
Але справжня магія виникає в поєднанні з NPOI Mapper від Donny Tian, оскільки це дозволяє мені зіставляти стовпці 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 .