Как читать файл excel в asp.net

Я использую библиотеку Epplus для загрузки данных из файла excel. Код, который я использую, отлично работает с файлом excel, который имеет стандартную форму. Если первая строка является столбцом и все остальные данные соответствуют столбцу. Но теперь дни, когда я регулярно получать файлы excel, которые имеют разную структуру, и я не могу читать файл excel, как показано ниже

то, что я хочу, – это третья строка, в которой находится только область и идентификатор местоположения и ее значения. Тогда 7-я строка – это столбцы и 8-го по 15-е значения. Наконец-то 17-я строка – это столбцы с 18-го по 20-е. Как загрузить все эти данные для разделения данных код, который я использовал, показан ниже. Я создал метод расширения

public static DataSet Exceltotable(this string path) { DataSet ds = null; using (var pck = new OfficeOpenXml.ExcelPackage()) { try { using (var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { pck.Load(stream); } ds = new DataSet(); var wss = pck.Workbook.Worksheets; //////////////////////////////////// //Application app = new Application(); //app.Visible = true; //app.Workbooks.Add(""); //app.Workbooks.Add(@"c:\MyWork\WorkBook1.xls"); //app.Workbooks.Add(@"c:\MyWork\WorkBook2.xls"); //for (int i = 2; i <= app.Workbooks.Count; i++) //{ // for (int j = 1; j <= app.Workbooks[i].Worksheets.Count; j++) // { // Worksheet ws = app.Workbooks[i].Worksheets[j]; // ws.Copy(app.Workbooks[1].Worksheets[1]); // } //} /////////////////////////////////////////////////// //for(int s=0;s<5;s++) //{ foreach (var ws in wss) { System.Data.DataTable tbl = new System.Data.DataTable(); bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach) string ErrorMessage = string.Empty; foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) { tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); } var startRow = hasHeader ? 2 : 1; for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) { var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; var row = tbl.NewRow(); foreach (var cell in wsRow) { //modifed by faras if (cell.Text != null) { row[cell.Start.Column - 1] = cell.Text; } } tbl.Rows.Add(row); tbl.TableName = ws.Name; } DataTable dt = RemoveEmptyRows(tbl); ds.Tables.Add(dt); } } catch (Exception exp) { } return ds; } } 

Если вы предоставляете шаблон для загрузки пользователями, вы можете уменьшить это, используя именованные диапазоны в своей электронной таблице. Это хорошая идея, когда вы программно работаете с Excel, потому что это помогает при изменении собственной таблицы, а не только тогда, когда пользователь делает это.

Вероятно, вы знаете, как назвать диапазон, но, ради полноты, вот как назвать диапазон .

Когда вы работаете с таблицей в коде, вы можете получить ссылку на диапазон, используя [yourworkbook].Names["yourNamedRange"] . Если это всего лишь одна ячейка, и вам нужно ссылаться на индекс строки или столбца, вы можете использовать .Start.Row или .Start.Column .

Я добавляю именованные диапазоны для чего угодно – ячейки, содержащие определенные значения, столбцы, строки заголовков, строки, где начинаются наборы данных. Если мне нужны индексы строк или столбцов, я присваиваю имена полезных переменных. Это защищает вас от наличия всяких «волшебных чисел» в вашей электронной таблице. Вы (или ваши пользователи) можете немного передвигаться, не нарушая ничего.

Если они слишком сильно изменяют структуру, это не сработает. Вы также можете использовать защиту в рабочей книге и рабочем листе, чтобы они не могли случайно изменить структуру – вкладки, строки, столбцы.


Это слабо взято из теста, который я работал с прошлыми выходными, когда я изучал это. Это был просто «мир привет», поэтому я не пытался сделать его все обтекаемым и совершенным. (Я работал над заполнением электронной таблицы, а не чтением, поэтому я просто изучаю свойства, когда я ухожу).

 // Open the workbook using (var package = new ExcelPackage(new FileInfo("PriceQuoteTemplate.xlsx"))) { // Get the worksheet I'm looking for var quoteSheet = package.Workbook.Worksheets["Quote"]; //If I wanted to get the text from one named range var cellText = quoteSheet.Workbook.Names["myNamedRange"].Text //If I wanted to get the cell's value as some other type var cellValue = quoteSheet.Workbook.Names["myNamedRange"].GetValue<int>(); //If I had a named range and I wanted to loop through the rows and get //values from certain columns var myRange = quoteSheet.Workbook.Names["rangeContainingRows"]; //This is a named range used to mark a column. So instead of using a //magic number, I'll read from whatever column has this named range. var someColumn = quoteSheet.Workbook.Names["columnLabel"].Start.Column; for(var rowNumber = myRange.Start.Row; rowNumber < myRange.Start.Row + myRange.Rows; rowNumber++) { var getTheTextForTheRowAndColumn = quoteSheet.Cells(rowNumber, someColumn).Text } 

Там может быть более элегантный способ обойти это. Я только начал использовать это сам. Но идея заключается в том, что вы скажете, чтобы найти определенный именованный диапазон в электронной таблице, а затем вы используете номер строки или столбца этого диапазона, а не магическую строку или номер столбца.

Даже если диапазон может быть одной ячейкой, одной строкой или одним столбцом, она потенциально может быть большей площадью. Вот почему я использую .Start.Row . Другими словами, дайте мне строку для первой ячейки диапазона. Если диапазон имеет более одной строки, свойство .Rows указывает количество строк, поэтому я знаю, сколько их есть. Это означает, что кто-то может даже вставлять строки без нарушения кода.

  • Экспорт Datatable
  • Загрузить файл Excel с помощью WebAPI / MVC
  • Как получить доступ к интерфейсу DropDown?
  • Копирование / вставка данных с 1 листа на другой путем сопоставления определенной ячейки или данных (Дата)
  • C # Interop получает последнюю строку с данными из определенного столбца
  • Создание XML-схемы из строки XML
  • Excel возвращает даты вместо вычисленного значения
  • обновить значение в ячейке, и все остальные ячейки будут автоматически изменены
  • Как узнать, совпадает ли текст в диапазоне?
  • Самый быстрый способ взаимодействия между живыми (несохраненными) данными Excel и объектами C #
  • «COM-объект, который был отделен от его базового RCW, не может быть использован»
  • Interesting Posts

    Тип или имя пространства имен SqlBulkCopy не удалось найти

    Как использовать vba для определения максимального значения в групповом значении в excel?

    Скопировать URL из браузера в Excel

    MS EXCEL FORMULA: поиск текста в пределах ROW и возвращаемого значения

    VBA: нужно читать акцентированные символы из текстового файла и записывать их

    Создание подписок на основе второго столбца в excel

    Функция поиска в нескольких листах данных

    Java API, который сжимает файл xls в формате xls

    Может ли кто-нибудь руководить мной, поскольку я получаю ошибку при объединении нескольких excels через python.?

    Извлечение данных из большого количества текстовых файлов в Excel

    Как найти соответствующие номера в Excel?

    Найти последний столбец, назначенный в Range

    Замена китайских иероглифов пробелами VBA

    Excel с использованием диапазона имен имен

    Интеграция .NET Office с использованием независимого от версии офиса

    Давайте будем гением компьютера.