首页 文章

如何省略excel导入到DataTable中的第一行

提问于
浏览
0

我的问题是我有一个电子表格要导入(在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(); }

数据导入数据表但后来我需要删除第一行,因为有人认为最好有两行 Headers . :(

当我包含“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'不属于表Sheet . ”

2 回答

  • 0

    “列'DataPointX'不属于表Sheet . ”

    如果使用 dt.Rows[RowIndex]["DataPointX"] 检索行的单元格,但DataTable不包含列 DataPointX ,这将抛出上述错误消息 . 请调试代码以检查变量 dt 并通过 DataSet Visualizer 查看dt的内容以确保列 DataPointX 存在 .

    enter image description here

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

    //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输出数据

    enter image description here

    如果您的Excel文件中的数据列DataPointX已填充数字,请尝试将单元格格式更改为 text 并测试是否可以解决问题 .

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

    enter image description here

  • 1

    我把它解决了,这是可以接受的:

    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();
    }
    

相关问题