【问题标题】:Dynamically create data table based on incoming Excel data in C#?在 C# 中根据传入的 Excel 数据动态创建数据表?
【发布时间】:2016-10-12 00:14:18
【问题描述】:

我正在尝试将 Excel 工作表导入 C# 中的数据表。我不断收到越界异常,因为我对列值进行了硬编码。

for (int c = 0; 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();

【问题讨论】:

    标签: c# asp.net excel datatable


    【解决方案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());
    }
    

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

    【讨论】:

    • 现在试试。第一次运行时出现错误。 "输入数组长于该表的列数。"
    • 如果你得到了,然后尝试设置一个断点并查看你的数据。您是否有一些行的列比第一行多?您通常不会遇到这样的问题,除非文件是以某种奇怪的方式创建的。
    • 是的,我现在正在逐步执行。逗号分隔会产生问题,因为某些数据是“Last, First”格式的名称。
    • 列名/值是否用引号括起来作为列标识符?如果是这种情况,您将需要做更多的工作来正确拆分列。
    • 您可以先从整个字符串中剥离第一个和最后一个",然后使用string[] columns = a.Split(new string[] { "\",\"" }, StringSplitOptions.None); 进行拆分,而不是上面实现的拆分。
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多