根据C#中的传入Excel数据动态创建数据表?

时间:2016-06-10 22:58:36

标签: c# asp.net excel datatable

我尝试将Excel工作表导入C#中的数据表。我不断得到一个超出界限的例外,因为我正在对这些列值进行硬编码。

  

for(int c = 0; c <40; c ++){...}

因此,在我创建表之前,有没有办法计算传入的所有列,而不是硬编码并且在我的数据表中列出了一堆空列?从而允许我围绕传入数据动态创建表?

以下是我的代码。

 if (fileUpload.HasFile)
      {
        DataTable dt = new DataTable();
        for (int c = 0; c <40; c++) { dt.Columns.Add(c.ToString(), typeof(string)); }
        using (Stream fileStream = fileUpload.PostedFile.InputStream)
        using (StreamReader sr = new StreamReader(fileStream))
        {
          string a = null;
          while ((a = sr.ReadLine()) != null)
          {
            dt.Rows.Add(a.Split(new char[] { ',' }).ToArray());
          }
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();

1 个答案:

答案 0 :(得分:1)

尝试使用类似的东西:

        DataTable dt;
        using (Stream fileStream = fileUpload.PostedFile.InputStream)
        using (StreamReader sr = new StreamReader(fileStream))
        {
            string a = null;
            while ((a = sr.ReadLine()) != null)
            {
                string[] columns = a.Split(',');
                if (dt == null)
                {
                    dt = new DataTable();
                    for (int i = 0; i < columns.Count(); i++)
                        dt.Columns.Add(new DataColumn(i.ToString(), typeof(string)));
                }
                dt.Rows.Add(columns);
            }
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();

只要第一行包含其余数据所包含的最大列数,就应该全部设置。

如果第一行是列名,则可以修改代码以在第一遍中跳过dt.Rows.Add(columns),并将i.ToString()替换为columns[i].ToString()以命名DataColumn正确。

如果您的列/值也被引号(")包围,那么您可以修改上面的while语句,如下所示:

while ((a = sr.ReadLine()) != null)
{
    a = a.Substring(1, a.Length - 2);
    string[] columns = a.Split(new string[] { "\",\"" }, StringSplitOptions.None);
    if (dt == null)
    {
        dt = new DataTable();
        for (int i = 0; i < columns.Count(); i++)
            dt.Columns.Add(new DataColumn(i.ToString(), typeof(string)));
    }
    dt.Rows.Add(a.Split(new char[] { ',' }).ToArray());
}

这将从整个字符串中删除第一个和最后一个",然后在","上拆分。您可能想要使用它,并添加代码以确定字段的分隔方式,或者您可以指定一些输入字段。也就是说,如果您的输入在定义方式上是可变的。