如何读取 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)
我有一个 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)