it-swarm.com.ru

Оптимальный способ чтения файла Excel (.xls/.xlsx)

Я знаю, что есть разные способы чтения файла Excel:

  • Iterop
  • Oledb
  • Open Xml SDK

Совместимость не является вопросом, потому что программа будет выполняться в контролируемой среде.

Мое требование:
Чтение файла в DataTable/CUstom Entities (я не знаю, как сделать динамические свойства/поля для объекта [имена столбцов будут варьироваться в файле Excel])

Используйте DataTable/Custom Entities для выполнения некоторых операций, используя свои данные.

Обновите DataTable с результатами операций

Запишите это обратно в Excel file.

Что было бы проще.

Также, если возможно, советуйте мне по поводу пользовательских сущностей (добавление свойств/полей к объекту динамически)

54
Ankesh

Посмотрите на Linq-to-Excel . Это довольно опрятно.

var book = new LinqToExcel.ExcelQueryFactory(@"File.xlsx");

var query =
    from row in book.Worksheet("Stock Entry")
    let item = new
    {
        Code = row["Code"].Cast<string>(),
        Supplier = row["Supplier"].Cast<string>(),
        Ref = row["Ref"].Cast<string>(),
    }
    where item.Supplier == "Walmart"
    select item;

Это также позволяет строго типизированный доступ к строке тоже.

61
Enigmativity

Используя OLE Query, это довольно просто (например, sheetName равно Sheet1 $):

DataTable LoadWorksheetInDataTable(string fileName, string sheetName)
{           
    DataTable sheetData = new DataTable();
    using (OleDbConnection conn = this.returnConnection(fileName))
    {
       conn.Open();
       // retrieve the data using data adapter
       OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
        sheetAdapter.Fill(sheetData);
    }                        
    return sheetData;
}

private OleDbConnection returnConnection(string fileName)
{
    return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\"");
}

Для более новых версий Excel:

return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0;");

Вы также можете использовать Excel Data Reader проект с открытым исходным кодом на CodePlex. Его очень хорошо работает для экспорта данных из листов Excel. 

Пример кода приведен по указанной ссылке:

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())
{
//excelReader.GetInt32(0);
}

//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();

Ссылка: Как мне импортировать из Excel в DataSet, используя Microsoft.Office.Interop.Excel?

20
Furqan Safdar

Попробуйте использовать этот бесплатный способ, https://freenetexcel.codeplex.com

 Workbook workbook = new Workbook();

 workbook.LoadFromFile(@"..\..\parts.xls",ExcelVersion.Version97to2003);
 //Initialize worksheet
 Worksheet sheet = workbook.Worksheets[0];

 DataTable dataTable = sheet.ExportDataTable();
5
Hark.Tenl

Если вы можете ограничить его только (в формате Open Office XML) * .xlsx файлами, то, вероятно, самой популярной библиотекой будет EPPLus .

Бонус есть, других зависимостей нет. Просто установите с помощью nuget:

Install-Package EPPlus
2
davewasthere

Я понимаю, что этот вопрос задавался почти 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 .

0
Dan