如何读取 excel 文件?

How to read a excel file?

我有一个 excel 文件,如下所示:

first Name       last Name
John             Doe
Sara             Boo

            string PATH = Directory.GetFiles(@"C:\file.xls);
        string connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + PATH + ";Extended Properties=Excel 12.0";



        OleDbConnection objConn = new OleDbConnection(connection);
        OleDbCommand objCmd = new OleDbCommand(string.Format(@"Select * From [Sheet1$A1:A43]"), objConn);
        OleDbDataAdapter objDatAdap = new OleDbDataAdapter();
        objDatAdap.SelectCommand = objCmd;
        DataSet ds = new DataSet();
        objDatAdap.Fill(ds);

我只想从文件中获取值 "John" 和 "Sara" 并对其执行比较方法以查看它们是否匹配。有帮助吗?

我首先建议最快和最简单的答案是第三列中的公式,例如 =IF(A1=A2,"Match","No-Match"(伪代码)。因此,这将是 Excel 中的解决方案,无需 C#。

否则,我发现处理此问题的最佳方法是将文件另存为 .csv,然后使用标准 C# 代码来执行此操作。

要直接回答您的问题,您可以查询 Excel 文件作为数据源,示例代码取自之前的答案 (Query excel sheet in c#):

OleDbConnection con = new OleDbConnection(
                "provider=Microsoft.Jet.OLEDB.4.0;data source="
                + XLS_FILE_NAME_AND_PATH_HERE
                + ";Extended Properties=Excel 8.0;");

            StringBuilder stbQuery = new StringBuilder();
            stbQuery.Append("SELECT * FROM [" + SHEETNAME_HERE + "$A1:D1]");
            OleDbDataAdapter adp = new OleDbDataAdapter(stbQuery.ToString(), con);

            DataSet dsXLS = new DataSet();
            adp.Fill(dsXLS);

            DataView dvEmp = new DataView(dsXLS.Tables[0]);

            dataGridView1.DataSource = dvEmp;

您可以使用例如库 LinqToExcel(https://github.com/paulyoder/LinqToExcel - 或 nuget) 并使用linq进行比较。

Class 用于映射

public class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

以及库使用示例

var excel = new ExcelQueryFactory("e.xlsx");//file name
excel.AddMapping<Person>(p => p.Name, "First Name");//mapping property to column
excel.AddMapping<Person>(p => p.Surname, "Last Name");//mapping property to column
var ppl = excel.Worksheet<Person>("Arkusz1").ToList();//Workspace name as parameter
var areTheSame = ppl.All(p => p.Name == ppl.First().Name);// Are all equal to first element

编辑: 您可以使用以下代码按 属性 对元素进行排序:

var ppl = excel.Worksheet<Person>("Arkusz1").OrderBy(p => p.Name).ToList();//Workspace name as parameter, sort by Name and return as list

要比较第一个和第二个元素,你可以使用这个:

var areTheSame = ppl[0].Name == ppl[1].Name;

编辑 2: 我不确定你的意思......你不知道如何比较对象?您的 excel 工作表映射到对象列表 - 在此示例中,对象列表类型为 Person。 list中的元素匹配行,所以ppl[0]是第一行,ppl[1]是第二行等等(当然排序前,排序后,顺序是不一样的)。 要比较对象,您可以使用 Equal 方法(您可以定义自己的比较对象的方式并在 class 中实现 IEquatable - 此处有更多内容 https://msdn.microsoft.com/pl-pl/library/ms131190(v=vs.110).aspx