我尝试将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();
答案 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());
}
这将从整个字符串中删除第一个和最后一个"
,然后在","
上拆分。您可能想要使用它,并添加代码以确定字段的分隔方式,或者您可以指定一些输入字段。也就是说,如果您的输入在定义方式上是可变的。