C# EPPlus读取列标题

C# EPPlus读取列标题,c#,C#,有没有一种简单的方法告诉EPPlus行是标题?或者我应该通过使用SelectedRange指定一个范围来创建标题,将其从工作表中删除并迭代剩余的单元格吗 我最终做了这样的事: class Program { static void Main(string[] args) { DirectoryInfo outputDir = new DirectoryInfo(@"C:\testdump\excelimports"); FileInfo exist

有没有一种简单的方法告诉EPPlus行是标题?或者我应该通过使用SelectedRange指定一个范围来创建标题,将其从工作表中删除并迭代剩余的单元格吗

我最终做了这样的事:

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);
            }
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
DirectoryInfo outputDir=新的DirectoryInfo(@“C:\testdump\excelimports”);
FileInfo existingFile=newfileinfo(outputDir.FullName+@“\Stormers.xlsx”);
Dictionary arrColumnNames=newdictionary(){{“First Name”、“”}、{“Last Name”、“”}、{“Email Address”、“”};
使用(ExcelPackage=新的ExcelPackage(现有文件))
{
Excel工作表=package.Workbook.Worksheets[1];
var q=来自表中的单元格。单元格
其中arrColumnNames.ContainsKey(cell.Value.ToString())
选择单元;
foreach(q中的var c)
{
arrColumnNames[c.Value.ToString()]=c.Address;
}
foreach(arrColumnNames中的var ck)
{
WriteLine(“{0}-{1}”,ck.Key,ck.Value);
}
var qValues=来自表格单元格中的r
其中!arrColumnNames.ContainsValue(r.Address.ToString())
选择r;
foreach(qValues中的var r)
{
Console.WriteLine(“{0}-{1}”,r.地址,r.值);
}
}
}
}
var pck=new OfficeOpenXml.ExcelPackage();
Load(newsystem.IO.FileInfo(path.OpenRead());
var ws=pck.Workbook.Worksheets[“Worksheet1”];
DataTable tbl=新的DataTable();
var hasHeader=true;
foreach(ws.Cells[1,1,1,ws.Dimension.End.Column]中的var firstRowCell){
添加(hashreader?firstRowCell.Text:string.Format(“Column{0}”,firstRowCell.Start.Column));
}
var startRow=hasHeader?2 : 1;

对于(var rowNum=startRow;rowNum我也遇到了类似的问题。下面是一些可能有帮助的代码:

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>();
        }
    }
}
使用(var-package=new-ExcelPackage(fileStream))
{
//在文件中获取工作簿
var工作簿=package.workbook;
if(workbook!=null&&workbook.Worksheets.Any())
{
//获取第一张工作表
var sheet=workbook.Worksheets.First();
//获取标题值
var column1Header=sheet.Cells[“A1”].GetValue();
var column2Header=sheet.Cells[“B1”].GetValue();
//“A2:A”是指“从A2开始(第1列,第2行),
//获取A列中所有填充的单元格”(是,异常范围语法)
var firstColumnRows=sheet.Cells[“A2:A”];
//循环第一列中的行,根据偏移量获取值
foreach(第一列行中的var单元格)
{
var column1CellValue=cell.GetValue();
var column2CellValue=cell.Offset(0,1).GetValue();
}
}
}

如果有人知道比cell.Offset更优雅的方法,请告诉我。

我需要枚举标题并向最终用户显示所有列标题。我以代码为基础,将其更改/转换为扩展方法,并从中删除硬编码数字

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();
    }
}
公共静态类ExcelWorksheetExtension
{
公共静态字符串[]GetHeaderColumns(此Excel工作表)
{
List columnNames=新列表();
foreach(表.Cells中的var firstRowCell[sheet.Dimension.Start.Row,sheet.Dimension.Start.Column,1,sheet.Dimension.End.Column])
columnNames.Add(firstRowCell.Text);
返回columnNames.ToArray();
}
}
我刚刚获取了代码,并使用系统Linq对其进行了转换

using System.Linq;
using OfficeOpenXml;

namespace Project.Extensions.Excel
{
    public static 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(this ExcelWorksheet sheet)
        {
            return sheet.Cells[sheet.Dimension.Start.Row, sheet.Dimension.Start.Column, 1, sheet.Dimension.End.Column]
                .Select(firstRowCell => firstRowCell.Text).ToArray();
        }
    }
}
使用System.Linq;
使用OfficeOpenXml;
命名空间Project.Extensions.Excel
{
公共静态类ExcelWorksheetExtension
{
/// 
///使用EPPlus获取标题行。
///     
/// 
/// 
///标题数组
公共静态字符串[]GetHeaderColumns(此Excel工作表)
{
返回sheet.Cells[sheet.Dimension.Start.Row,sheet.Dimension.Start.Column,1,sheet.Dimension.End.Column]
.Select(firstRowCell=>firstRowCell.Text).ToArray();
}
}
}

你能描述一下你的问题到底是什么吗?如果你知道第一行是一个标题,那么从第二行开始迭代就会出现问题。如果标题是空的,比如没有标题文本的列,这个代码段会忽略这个标题:(
using System.Linq;
using OfficeOpenXml;

namespace Project.Extensions.Excel
{
    public static 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(this ExcelWorksheet sheet)
        {
            return sheet.Cells[sheet.Dimension.Start.Row, sheet.Dimension.Start.Column, 1, sheet.Dimension.End.Column]
                .Select(firstRowCell => firstRowCell.Text).ToArray();
        }
    }
}