SQLBulkcopy - En-tête d'obtention de données insérée dans la table de base de données

asp.net asp.net-mvc c# npoi sqlbulkcopy

Question

L'en-tête du datatable est en train d'être inséré en tant qu'enregistrement dans la table. J'incrémente le numéro de la ligne mais l'en-tête est quand même inséré. Quelqu'un pourrait-il me dire quel est le problème? Si vous voyez le code ci-dessous, je suis en train de faire des lignes.MoveNext.

        XSSFWorkbook xssfwb;
        using (FileStream file = new FileStream(excelPath, FileMode.Open, FileAccess.Read))
        {
            xssfwb = new XSSFWorkbook(file);
        }


        var sheet = xssfwb.GetSheetAt(0); // Change this to the worksheet you want to import.
        var rows = sheet.GetRowEnumerator();

        var dtExcelData = new DataTable();
        var linenumber = 0;
        DataRow dr;


        dtExcelData.Columns.AddRange(new DataColumn[3] { 
        new DataColumn("AccountNumber", typeof(string)),
        new DataColumn("Amount", typeof(decimal)),
        new DataColumn("Sedol",typeof(string)) });



        while (rows.MoveNext())
        {
            IRow row = (XSSFRow)rows.Current;
            linenumber++;

            row.GetCell(4).SetCellType(CellType.Numeric);

            if (row.GetCell(0) != null)
            {
                dr = dtExcelData.NewRow();
                dr["AccountNumber"] = row.GetCell(1).ToString();
                dr["Amount"] = decimal.Parse(row.GetCell(4).ToString());
                //dr["Amount"] = (decimal)row.GetCell(4).NumericCellValue;
                dr["Sedol"] = row.GetCell(11).ToString();


                dtExcelData.Rows.Add(dr);
            }
        }

        //DealingContext.ExecuteCommand("TRUNCATE TABLE [dbDealing].[MESSAGING].[Rebate]");
        DealingContext.ExecuteCommand("TRUNCATE TABLE [dbo].[Testxyz]");




        //Set the database table name
        using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(DealingContext.Connection.ConnectionString))
        {
            //sqlBulkCopy.DestinationTableName = "[dbo].[Testxyz]";
            sqlBulkCopy.DestinationTableName = "[dbo].[Testxyz]";

            //[OPTIONAL]: Map the Excel columns with that of the database table

            sqlBulkCopy.ColumnMappings.Add("AccountNumber", "AccountNumber");
            sqlBulkCopy.ColumnMappings.Add("Amount", "Amount");
            sqlBulkCopy.ColumnMappings.Add("Sedol", "Sedol");
            sqlBulkCopy.WriteToServer(dtExcelData);


        }

Réponse populaire

L'en-tête est la première ligne renvoyée par les rows . Il suffit de sauter cette ligne lors de l'importation.

//(snip)
    dtExcelData.Columns.AddRange(new DataColumn[3] { 
    new DataColumn("AccountNumber", typeof(string)),
    new DataColumn("Amount", typeof(decimal)),
    new DataColumn("Sedol",typeof(string)) });


    //Makes the header row the current row.
    rows.MoveNext();

    //Moves to the first row with data and loops till done.
    while (rows.MoveNext())
    {
        IRow row = (XSSFRow)rows.Current;
        linenumber++;

        row.GetCell(4).SetCellType(CellType.Numeric);

        if (row.GetCell(0) != null)
        {
//(snip)


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi