asp.net 如何在C#中动态读取Excel表格中的数据并添加到列表中

8zzbczxx  于 2022-12-20  发布在  .NET
关注(0)|答案(2)|浏览(266)

我正在尝试使用Excel工作表上载一些组织数据。Excel工作表有多个列和行,但列的位置每次上载时都会发生变化。如果列位置每次都保持不变,我可以设法读取Excel文件,但不确定如果列位置不一致,如何动态读取和Map字段。
我有一个Excel类似于此,列名称总是保持不变,但列的位置是不一致的每一次单次上传:

|OrgName | OrgNumber| OrgLevel| OrgState | OrgText| OrgCode| OrgStatus |
| ABC    | 123      | 5       | NY       | ABC1   | N/A    | Active    |
| XYZ    | 456      | 6       | WA       | XYZ1   | N/A    | N/A       |
| ASD    | 789      | 8       | MA       | ASD1   | 4566   | Active    |
| JKL    | 852      | 7       | IL       | JKL1   | 7418   | Active    |

样本代码:

DataSet dataSet = excelStream(files);
            DataTable tbl = dataSet.Tables[0];

            List<Model> Listmodel = new List<Model>();

            for (int i = 1; i<tbl.Rows.Count; i++)
            {
                Model model = new Model();
                model.OrgName = tbl.Rows[i][0].ToString();
                model.OrgNumber = tbl.Rows[i][1].ToString();
                model.OrgLevel = tbl.Rows[i][2].ToString();
                model.OrgState = tbl.Rows[i][3].ToString();
                model.OrgText = tbl.Rows[i][4].ToString();
                model.OrgCode = tbl.Rows[i][5].ToString();
                model.OrgStatus = tbl.Rows[i][7].ToString();
                Listmodel.Add(model);
             }

现在我需要动态读取数据来Map字段。有人能帮我吗?

djp7away

djp7away1#

要动态读取Excel文件并将列Map到字段,可以使用以下方法:
首先,需要读取Excel文件的第一行,其中包含列名。可以使用DataTable.Rows属性完成此操作。
然后,您可以创建一个字典,将列名Map到列索引,这样您就可以查找给定列名的列索引。
接下来,可以迭代DataTable的行,并使用字典查找每个字段的列索引。然后,可以使用这些列索引从DataTable读取值并填充模型对象。
下面是一个如何实现这一点的示例:

DataSet dataSet = excelStream(files);
DataTable tbl = dataSet.Tables[0];

// Read the first row of the Excel file, which contains the column names
DataRow columnRow = tbl.Rows[0];

// Create a dictionary that maps column names to column indices
Dictionary<string, int> columnIndices = new Dictionary<string, int>();
for (int i = 0; i < columnRow.ItemArray.Length; i++)
{
    columnIndices[columnRow[i].ToString()] = i;
}

List<Model> Listmodel = new List<Model>();

// Iterate over the rows of the DataTable
for (int i = 1; i < tbl.Rows.Count; i++)
{
    Model model = new Model();
    model.OrgName = tbl.Rows[i][columnIndices["OrgName"]].ToString();
    model.OrgNumber = tbl.Rows[i][columnIndices["OrgNumber"]].ToString();
    model.OrgLevel = tbl.Rows[i][columnIndices["OrgLevel"]].ToString();
    model.OrgState = tbl.Rows[i][columnIndices["OrgState"]].ToString();
    model.OrgText = tbl.Rows[i][columnIndices["OrgText"]].ToString();
    model.OrgCode = tbl.Rows[i][columnIndices["OrgCode"]].ToString();
    model.OrgStatus = tbl.Rows[i][columnIndices["OrgStatus"]].ToString();
    Listmodel.Add(model);
 }

这种方法允许您动态读取Excel文件,而不管列的位置如何

lsmd5eda

lsmd5eda2#

您可以将Excel导出为CSV,它将始终从A1开始Map列,这样您就可以迭代CSV文件,并且不会出现动态Map问题

相关问题