C# Excel读取器返回空值,无任何原因c

C# Excel读取器返回空值,无任何原因c,c#,excel,office-interop,C#,Excel,Office Interop,我的代码在读取excel文件中的值时遇到了一个小问题。我使用循环读取每行的行数和每单元格的单元格数 excel文件中的前152行读取正确,但在第153行之后,每个单元格仅获得空值 这是我的代码: public DataTable parseExcelFile(string path,bool firstLineHeader) { DataTable values = new DataTable("Impayés"); Excel.Application appExcel = ne

我的代码在读取excel文件中的值时遇到了一个小问题。我使用循环读取每行的行数和每单元格的单元格数

excel文件中的前152行读取正确,但在第153行之后,每个单元格仅获得空值

这是我的代码:

public DataTable parseExcelFile(string path,bool firstLineHeader)
{
    DataTable values = new DataTable("Impayés");
    Excel.Application appExcel = new Excel.Application();
    Excel.Workbook wb = appExcel.Workbooks.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    Excel.Worksheet sheet = (Excel.Worksheet)wb.Sheets["Feuil1"];
    Excel.Range excelRange = sheet.UsedRange;
    bool premiere = firstLineHeader;
    foreach (Excel.Range row in excelRange.Rows)
    {
        if (!premiere)
        {
            int rowNumber = row.Row;//Récupération du numéro de ligne
            //Récupération des valeurs des cellules de la ligne en cours
            string groupe = Convert.ToString(row.Range["A" + rowNumber.ToString()].Value);
            if (groupe == null)
                MessageBox.Show("Eh c'est vide ! (Ligne "+ rowNumber.ToString() + ")");
            string sousgroupe = Convert.ToString(row.Range["B" + rowNumber.ToString()].Value);
            string codeapporteur = Convert.ToString(row.Range["C" + rowNumber.ToString()].Value);
            string apporteur = Convert.ToString(row.Range["D" + rowNumber.ToString()].Value);
            string dossier = Convert.ToString(row.Range["E" + rowNumber.ToString()].Value);
            string siren = Convert.ToString(row.Range["F" + rowNumber.ToString()].Value);
            string client = Convert.ToString(row.Range["G" + rowNumber.ToString()].Value);
            string adresse = Convert.ToString(row.Range["H" + rowNumber.ToString()].Value);
            string localite = Convert.ToString(row.Range["I" + rowNumber.ToString()].Value);
            string cp = Convert.ToString(row.Range["J" + rowNumber.ToString()].Value);
            string ville = Convert.ToString(row.Range["K" + rowNumber.ToString()].Value);
            string telephone = string.Format("{0:00}{1:00}{2:00}{3:00}{4:00}", row.Range["L" + rowNumber.ToString()].Value, row.Range["M" + rowNumber.ToString()].Value,row.Range["N" + rowNumber.ToString()].Value,row.Range["O" + rowNumber.ToString()].Value,row.Range["P" + rowNumber.ToString()].Value);
            string etat = Convert.ToString(row.Range["Q" + rowNumber.ToString()].Value);
            string bic = Convert.ToString(row.Range["R" + rowNumber.ToString()].Value);
            string iban = Convert.ToString(row.Range["S" + rowNumber.ToString()].Value);
            RIB rib = new RIB(bic, iban);
            string domiciliationrib = Convert.ToString(row.Range["T" + rowNumber.ToString()].Value);
            string bienfinance = Convert.ToString(row.Range["U" + rowNumber.ToString()].Value);
            decimal mt_ht_fi = Convert.ToDecimal(row.Range["V" + rowNumber.ToString()].Value);
            decimal mt_ech = Convert.ToDecimal(row.Range["W" + rowNumber.ToString()].Value);
            string dateapp = Convert.ToString(row.Range["X" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["Y" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["Z" + rowNumber.ToString()].Value);
            string terme = Convert.ToString(row.Range["AA" + rowNumber.ToString()].Value);
            string premiereech = Convert.ToString(row.Range["AB" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AC" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AD" + rowNumber.ToString()].Value);
            string derniereech = Convert.ToString(row.Range["AE" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AF" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AG" + rowNumber.ToString()].Value);
            int nbimp = MyConverter.ToInt(Convert.ToString(row.Range["AH" + rowNumber.ToString()].Value));
            decimal mt_imp_1 = Convert.ToDecimal(row.Range["AI" + rowNumber.ToString()].Value);
            string dateimpaye1 = Convert.ToString(row.Range["AJ" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AK" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AL" + rowNumber.ToString()].Value);
            int motifimpaye1 = MyConverter.ToInt(Convert.ToString(row.Range["AM" + rowNumber.ToString()].Value));
            string dateimpaye2 = Convert.ToString(row.Range["AN" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AO" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AP" + rowNumber.ToString()].Value);
            int motifimpaye2 = MyConverter.ToInt(Convert.ToString(row.Range["AQ" + rowNumber.ToString()].Value));
            string dateimpaye3 = Convert.ToString(row.Range["AR" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AS" + rowNumber.ToString()].Value) + "/" + Convert.ToString(row.Range["AT" + rowNumber.ToString()].Value);
            int motifimpaye3 = MyConverter.ToInt(Convert.ToString(row.Range["AU" + rowNumber.ToString()].Value));
            DataRow dr = values.Rows.Add(groupe, sousgroupe, codeapporteur, apporteur, dossier, siren, client, adresse, localite, cp, ville, telephone, etat, bic, iban, domiciliationrib, bienfinance, mt_ht_fi, mt_ech, dateapp, terme, premiereech, derniereech, nbimp, mt_imp_1, dateimpaye1, motifimpaye1, dateimpaye2, motifimpaye2, dateimpaye3, motifimpaye3);
        }
        else
        {
            foreach (Excel.Range eRange in row.Range["A1:AU1"].Cells)
            {
                if (eRange.Value != "TEL2" && eRange.Value != "TEL3" && eRange.Value != "TEL4" && eRange.Value != "TEL5" && eRange.Value != "Col_21" && eRange.Value != "Col_22" && eRange.Value != "Col_25" && eRange.Value != "Col_26" && eRange.Value != "Col_28" && eRange.Value != "Col_29")
                    values.Columns.Add(eRange.Value);
            }
            premiere = false;
        }
    }
    return values;
}
这是我的excel文件的示例行:


尝试删除该行152,或在文档中上移或下移该行,然后查看错误是否跟随该行

如果将该行移动到145,然后程序停止在第145行,那么我们找到了问题的根源:数据。该行中可能有无效或不可读的字符,它会使程序崩溃。它很可能是其中一行中的一个字母,应该是十进制或整数


此外,每次运行循环时都要实例化所有字符串、小数和整数。您应该在循环之前声明它们,然后在循环中设置它们的值。这是一个通用的良好实践。

我不知道为什么它在代码中不起作用,但我可以建议您不要在每一行上循环,而是将所有数据收集在一行中,即object[,]values=excelRange.Value;,那就绕过去?它会快得多。消息框也是第一次显示在153上吗?要尝试的事情:从xls转换到xlsx。打开一个空白的xlsx,然后将原始文件中的所有内容粘贴到一张空白工作表中,无需格式化。有时excel文件会损坏,尤其是旧的xls文件。顺便说一句,usedrange在运行时会显示多少行?@dlatikay是的,我把它放在问题发生的时间+它是xlsxfile@dlatikay当我打开文件时出现31行相同的问题,如果我将行移动到145,程序将在第1533行再次崩溃。也许你也可以移动153排。很抱歉,我没有在我原来的帖子中提到它,但问题也可能在后面一行——这取决于它在过程中的崩溃位置。缓慢的调试解决方案是在循环中放置一个断点,并将其设置为“仅在迭代152或153时停止”。需要尝试一两次才能确定哪一行导致崩溃。然后在循环中前后移动断点,以确定导致崩溃的代码段。相同的问题如果我删除第153行、第154行和第155行,断点不会显示任何问题,读取器只返回null。。。