C# 如何省略excel导入到数据表中的第一行

C# 如何省略excel导入到数据表中的第一行,c#,azure,datatable,azure-sql-database,C#,Azure,Datatable,Azure Sql Database,我的问题是我有一个电子表格要导入(在azure上,所以我不能使用excel连接器),但在工作表的顶部有两行。我需要删除第一行,因为第二行有列名。其余的行是数据 DataTable dt = new DataTable(); FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader

我的问题是我有一个电子表格要导入(在azure上,所以我不能使用excel连接器),但在工作表的顶部有两行。我需要删除第一行,因为第二行有列名。其余的行是数据

DataTable dt = new DataTable();
FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();
dt = result.Tables[0];
if (dt.Rows[0].ItemArray[0].ToString() == "Category Info") { dt.Rows[0].Delete(); dt.AcceptChanges(); }
数据导入到数据表中,但我需要删除第一行,因为有人认为头有两行是个好主意:(

当我包含“if”语句时,我得到一个错误,即导入中缺少列

我试图解决的挑战是允许用户将特定格式的excel文件导入AZURE上运行的web应用程序,据我所知,AZURE上没有excel库…因此,批量复制

我还尝试:

DataSet result = excelReader.AsDataSet();
if (result.Tables[0].Rows[0].ItemArray[0].ToString() == "Category Info") { result.Tables[0].Rows[0].Delete(); result.AcceptChanges(); }
dt = result.Tables[0];
仍然得到结果“列'DataPointX'不属于表工作表。”

“列'DataPointX'不属于表工作表。”

如果使用
dt.Rows[RowIndex][“DataPointX”]检索行的单元格
但DataTable不包含列DataPointX,这将抛出上述错误消息。请调试代码以检查变量
dt
,并通过数据集可视化工具查看dt的内容,以确保列DataPointX存在

此外,我使用您提供的代码从我这边下面的Excel文件中读取数据,如果DataPointX是number,我发现它将丢失

//read data from excel, same as yours

excelReader.Close();
dt = result.Tables[0];

if (dt.Rows[0].ItemArray[0].ToString() == "Category Info")
{
    dt.Rows[0].Delete();
    dt.AcceptChanges();
}

GridView1.DataSource = dt;
GridView1.DataBind();
GridView输出数据

如果列DataPointX在excel文件中用数字填充,请尝试将单元格格式更改为文本,并测试是否可以解决此问题

我的测试Excel文件(DataPointX字段数据为数字,DataPointY字段数据为文本)


我已经解决了,这是可以接受的:

FileStream stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

DataTable dt = new DataTable();
dt = excelReader.AsDataSet().Tables[0];

Int16 shift = 0;
if (dt.Rows[0].ItemArray[0].ToString() == "Some Text in the header")
{
    shift = 1; //If the first row is a header, we need to shift everything up one row.
}

foreach (DataColumn Col in dt.Columns)
{
    Col.ColumnName = dt.Rows[shift].ItemArray[Col.Ordinal].ToString();
}

很好的回答。我会调查并报告。谢谢!好的,所以当我在加载数据后浏览dt对象时,我看到列仍然标记为第一行没有被删除。问题是:我在工作表顶部有两行,我需要删除第一行,因为第二行是有列名的。