如何使用 EPPlus 在 C# 中逐行读取 excel 文件
How to read excel files row by row in c# using EPPlus
在我的 MVC 控制器中,我试图逐行读取 excel。但是有一个问题。
我希望能够将其映射到列表。模型 class 包含 29 个字段。
public class GroupMembershipUploadInput
{
public string chpt_cd {get;set;}
public string cnst_mstr_id {get;set;}
public string cnst_prefix_nm {get;set;}
public string cnst_first_nm {get;set;}
public string cnst_middle_nm {get;set;}
public string cnst_last_nm {get;set;}
public string cnst_addr1_street1 {get;set;}
public string cnst_addr1_street2 {get;set;}
public string cnst_addr1_city {get;set;}
public string cnst_addr1_state {get;set;}
public string cnst_addr1_zip {get;set;}
public string cnst_addr2_street1 {get;set;}
public string cnst_addr2_street2 {get;set;}
public string cnst_addr2_city {get;set;}
public string cnst_addr2_state {get;set;}
public string cnst_addr2_zip {get;set;}
public string cnst_phn1_num {get;set;}
public string cnst_phn2_num {get;set;}
public string cnst_phn3_num {get;set;}
public string cnst_email1_addr {get;set;}
public string cnst_email2_addr {get;set;}
public string job_title {get;set;}
public string company_nm {get;set;}
public string grp_cd {get;set;}
public string grp_nm {get;set;}
public string rm_ind {get;set;}
public string notes {get;set;}
public string stuart_cnst_grp_key {get;set;}
public string created_by {get;set;}
public string created_dt {get;set;}
}
public class ListGroupMembershipUploadInput
{
public List<GroupMembershipUploadInput> GroupMembershipUploadInputList { get; set; }
}
收获是
我应该根据列 header 将 excel 中的字段映射到此字段。像这里一样,excel 中的列 headers 可以是
因此,无需硬编码,我应该能够将列 header "First Name" 下的值放入模型字段 "cnst_first_nm"。
等等。
此列在 excel 中也不必按此顺序排列。所以需要灵活。
我正在尝试:
ExcelPackage ep = new ExcelPackage(new FileInfo(savedFilePath));
ExcelWorksheet ws = ep.Workbook.Worksheets["Sheet1"];
ListGroupMembershipUploadInput gl = new ListGroupMembershipUploadInput();
for (int i = 3; i <= ws.Dimension.End.Row; i++)
{
GroupMembershipUploadInput gm = new GroupMembershipUploadInput();
for (int j = ws.Dimension.Start.Column; j <= ws.Dimension.End.Column; j++)
{
//gm.cnst_first_nm = ws.Cells[i, j].Value.ToString();
}
gl.Add(gm);
}
我无法解决。我知道在某处我遗漏了一些东西。可以做什么?
So, without hard coding I should be able to put the value under column header "First Name" to the model field "cnst_first_nm". and so on.
我不太确定你在这里的意思,但你需要一些方法来告诉你的代码哪个 excel header 值映射到哪个 属性。
如果是我,我会使用从 header 值到 Action<strng, GroupMembershipUploadInput>
的映射来执行此操作,在给定的 GroupMembershipUploadInput
[= 上设置映射 属性 35=]。
所以我会从类似这样的东西开始映射所有 'setter' 操作:
Dictionary<string, Action<string, GroupMembershipUploadInput>> MapFieldSetters { get; set; } =
new Dictionary<string, Action<string, GroupMembershipUploadInput>>()
{
{ "First Name", (s,g) => g.cnst_first_nm = s },
{ "Last Name", (s,g) => g.cnst_Last_nm = s },
//... <snip>
};
然后我们需要在我们正在导入的文件中找到每一列的索引header。假设 header 位于第一行,并且假设我们不需要担心跳过任何字段,我们可以这样做:
var columnHeadersInOrder = new List<string>();
for (int col = 1; col <= ws.Dimension.End.Column; col++)
{
var headerValue = ws.Cells[1, col].Value.ToString();
columnHeadersInOrder.Add(headerValue);
}
这为我们提供了所有列 header 的 List
,按照它们在 excel 工作表中出现的顺序排列。我们现在可以通过首先从有序列表中检索列 header 然后检索并调用 Mapped Action<string,GroupMembershipUploadInput>
来设置 object:
上的值来完成您的函数
for (int i = 3; i <= ws.Dimension.End.Row; i++)
{
GroupMembershipUploadInput gm = new GroupMembershipUploadInput();
for (int j = ws.Dimension.Start.Column; j <= ws.Dimension.End.Column; j++)
{
var columnHeader = columnHeadersInOrder[j - ws.Dimension.Start.Column];
var cellValue = ws.Cells[i, j].Value.ToString();
MapFieldSetters[columnHeader](cellValue, gm);
}
gl.Add(gm);
}
一个简单的例子
public void readXLS(string FilePath)
{
FileInfo existingFile = new FileInfo(FilePath);
using (ExcelPackage package = new ExcelPackage(existingFile))
{
//get the first worksheet in the workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
int colCount = worksheet.Dimension.End.Column; //get Column Count
int rowCount = worksheet.Dimension.End.Row; //get row count
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells[row, col].Value.ToString().Trim());
}
}
}
}
在我的 MVC 控制器中,我试图逐行读取 excel。但是有一个问题。
我希望能够将其映射到列表。模型 class 包含 29 个字段。
public class GroupMembershipUploadInput
{
public string chpt_cd {get;set;}
public string cnst_mstr_id {get;set;}
public string cnst_prefix_nm {get;set;}
public string cnst_first_nm {get;set;}
public string cnst_middle_nm {get;set;}
public string cnst_last_nm {get;set;}
public string cnst_addr1_street1 {get;set;}
public string cnst_addr1_street2 {get;set;}
public string cnst_addr1_city {get;set;}
public string cnst_addr1_state {get;set;}
public string cnst_addr1_zip {get;set;}
public string cnst_addr2_street1 {get;set;}
public string cnst_addr2_street2 {get;set;}
public string cnst_addr2_city {get;set;}
public string cnst_addr2_state {get;set;}
public string cnst_addr2_zip {get;set;}
public string cnst_phn1_num {get;set;}
public string cnst_phn2_num {get;set;}
public string cnst_phn3_num {get;set;}
public string cnst_email1_addr {get;set;}
public string cnst_email2_addr {get;set;}
public string job_title {get;set;}
public string company_nm {get;set;}
public string grp_cd {get;set;}
public string grp_nm {get;set;}
public string rm_ind {get;set;}
public string notes {get;set;}
public string stuart_cnst_grp_key {get;set;}
public string created_by {get;set;}
public string created_dt {get;set;}
}
public class ListGroupMembershipUploadInput
{
public List<GroupMembershipUploadInput> GroupMembershipUploadInputList { get; set; }
}
收获是
我应该根据列 header 将 excel 中的字段映射到此字段。像这里一样,excel 中的列 headers 可以是
因此,无需硬编码,我应该能够将列 header "First Name" 下的值放入模型字段 "cnst_first_nm"。 等等。
此列在 excel 中也不必按此顺序排列。所以需要灵活。
我正在尝试:
ExcelPackage ep = new ExcelPackage(new FileInfo(savedFilePath));
ExcelWorksheet ws = ep.Workbook.Worksheets["Sheet1"];
ListGroupMembershipUploadInput gl = new ListGroupMembershipUploadInput();
for (int i = 3; i <= ws.Dimension.End.Row; i++)
{
GroupMembershipUploadInput gm = new GroupMembershipUploadInput();
for (int j = ws.Dimension.Start.Column; j <= ws.Dimension.End.Column; j++)
{
//gm.cnst_first_nm = ws.Cells[i, j].Value.ToString();
}
gl.Add(gm);
}
我无法解决。我知道在某处我遗漏了一些东西。可以做什么?
So, without hard coding I should be able to put the value under column header "First Name" to the model field "cnst_first_nm". and so on.
我不太确定你在这里的意思,但你需要一些方法来告诉你的代码哪个 excel header 值映射到哪个 属性。
如果是我,我会使用从 header 值到 Action<strng, GroupMembershipUploadInput>
的映射来执行此操作,在给定的 GroupMembershipUploadInput
[= 上设置映射 属性 35=]。
所以我会从类似这样的东西开始映射所有 'setter' 操作:
Dictionary<string, Action<string, GroupMembershipUploadInput>> MapFieldSetters { get; set; } =
new Dictionary<string, Action<string, GroupMembershipUploadInput>>()
{
{ "First Name", (s,g) => g.cnst_first_nm = s },
{ "Last Name", (s,g) => g.cnst_Last_nm = s },
//... <snip>
};
然后我们需要在我们正在导入的文件中找到每一列的索引header。假设 header 位于第一行,并且假设我们不需要担心跳过任何字段,我们可以这样做:
var columnHeadersInOrder = new List<string>();
for (int col = 1; col <= ws.Dimension.End.Column; col++)
{
var headerValue = ws.Cells[1, col].Value.ToString();
columnHeadersInOrder.Add(headerValue);
}
这为我们提供了所有列 header 的 List
,按照它们在 excel 工作表中出现的顺序排列。我们现在可以通过首先从有序列表中检索列 header 然后检索并调用 Mapped Action<string,GroupMembershipUploadInput>
来设置 object:
for (int i = 3; i <= ws.Dimension.End.Row; i++)
{
GroupMembershipUploadInput gm = new GroupMembershipUploadInput();
for (int j = ws.Dimension.Start.Column; j <= ws.Dimension.End.Column; j++)
{
var columnHeader = columnHeadersInOrder[j - ws.Dimension.Start.Column];
var cellValue = ws.Cells[i, j].Value.ToString();
MapFieldSetters[columnHeader](cellValue, gm);
}
gl.Add(gm);
}
一个简单的例子
public void readXLS(string FilePath)
{
FileInfo existingFile = new FileInfo(FilePath);
using (ExcelPackage package = new ExcelPackage(existingFile))
{
//get the first worksheet in the workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
int colCount = worksheet.Dimension.End.Column; //get Column Count
int rowCount = worksheet.Dimension.End.Row; //get row count
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells[row, col].Value.ToString().Trim());
}
}
}
}