2012-04-23 3 views
1

Есть ли простой способ сказать EPPlus, что строка является заголовком? Или я должен создавать заголовки, задавая диапазон с помощью SelectedRange, удаляя его из листа и повторяя оставшиеся ячейки?EPPlus Чтение заголовков столбцов

я в конечном итоге делает это:

class Program 
{ 
    static void Main(string[] args) 
    { 
     DirectoryInfo outputDir = new DirectoryInfo(@"C:\testdump\excelimports"); 
     FileInfo existingFile = new FileInfo(outputDir.FullName + @"\Stormers.xlsx"); 
     Dictionary<string, string> arrColumnNames = new Dictionary<string,string>() { { "First Name", "" }, { "Last Name", "" }, { "Email Address", "" } }; 
     using (ExcelPackage package = new ExcelPackage(existingFile)) 
     { 
      ExcelWorksheet sheet = package.Workbook.Worksheets[1]; 
      var q = from cell in sheet.Cells 
        where arrColumnNames.ContainsKey(cell.Value.ToString()) 
        select cell; 

      foreach (var c in q) 
      { 
       arrColumnNames[c.Value.ToString()] = c.Address; 
      } 
      foreach (var ck in arrColumnNames) 
      { 
       Console.WriteLine("{0} - {1}", ck.Key, ck.Value); 
      } 

      var qValues = from r in sheet.Cells 
          where !arrColumnNames.ContainsValue(r.Address.ToString()) 
          select r; 

      foreach (var r in qValues) 
      { 
       Console.WriteLine("{0} - {1}", r.Address, r.Value); 
      } 
     } 
    } 
} 
+0

Вы описываете, что конкретно связано с вашей проблемой? Если вы знаете, что первая строка - это начало заголовка, повторяющееся со второй строки –

ответ

2
var pck = new OfficeOpenXml.ExcelPackage(); 
pck.Load(new System.IO.FileInfo(path).OpenRead()); 
var ws = pck.Workbook.Worksheets["Worksheet1"]; 
DataTable tbl = new DataTable(); 
var hasHeader = true; 
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){ 
      row[cell.Start.Column - 1] = cell.Text; 
    } 
    tbl.Rows.Add(row); 
} 
3

У меня была аналогичная проблема. Вот код, который может помочь:

using (var package = new ExcelPackage(fileStream)) 
{ 
    // Get the workbook in the file 
    var workbook = package.Workbook; 
    if (workbook != null && workbook.Worksheets.Any()) 
    { 
     // Get the first worksheet 
     var sheet = workbook.Worksheets.First(); 

     // Get header values 
     var column1Header = sheet.Cells["A1"].GetValue<string>(); 
     var column2Header = sheet.Cells["B1"].GetValue<string>(); 

     // "A2:A" means "starting from A2 (1st col, 2nd row), 
     // get me all populated cells in Column A" (yes, unusual range syntax) 
     var firstColumnRows = sheet.Cells["A2:A"]; 

     // Loop through rows in the first column, get values based on offset 
     foreach (var cell in firstColumnRows) 
     { 
      var column1CellValue = cell.GetValue<string>(); 
      var column2CellValue = cell.Offset(0, 1).GetValue<string>(); 
     } 
    } 
} 

Если кто знает более элегантно, чем cell.Offset, дайте мне знать.

11

Мне нужно было перечислить заголовок и отобразить все заголовки столбцов для моего конечного пользователя. Я взял Muhammad Mubashir код в качестве базы и изменил/преобразовал его в метод расширения и удалил из него жестко закодированные номера.

public static class ExcelWorksheetExtension 
{ 
    public static string[] GetHeaderColumns(this ExcelWorksheet sheet) 
    { 
     List<string> columnNames = new List<string>(); 
     foreach (var firstRowCell in sheet.Cells[sheet.Dimension.Start.Row, sheet.Dimension.Start.Column, 1, sheet.Dimension.End.Column]) 
      columnNames.Add(firstRowCell.Text); 
     return columnNames.ToArray(); 
    } 
} 
+0

Однако есть проблема. Если есть пустой заголовок, например столбец, который не имеет заголовка, этот фрагмент будет игнорировать этот :( –

0

Я только что принял ndd и конвертировал его с использованием System Linq.

using System.Linq; 
using OfficeOpenXml; 

namespace Project.Extensions.Excel 
{ 
    public class ExcelWorksheetExtension 
    { 
     /// <summary> 
     ///  Get Header row with EPPlus. 
     ///  <a href="https://stackoverflow.com/questions/10278101/epplus-reading-column-headers"> 
     ///   EPPlus Reading Column Headers 
     ///  </a> 
     /// </summary> 
     /// <param name="sheet"></param> 
     /// <returns>Array of headers</returns> 
     public static string[] GetHeaderColumns(ExcelWorksheet sheet) 
     { 
      return sheet.Cells[sheet.Dimension.Start.Row, sheet.Dimension.Start.Column, 1, sheet.Dimension.End.Column] 
       .Select(firstRowCell => firstRowCell.Text).ToArray(); 
     } 
    } 
} 
Смежные вопросы