C#读取excel文件忽略第一行

标签 c# excel dataset oledb

我正在使用 OLEDB 阅读 Excel文件。阅读后我将其保存到 DataSet以供将来使用。

以下代码工作得很好,但总是 忽略 Excel 的第一行文件。
这怎么可能解决?
请忽略评论和异常的文本。
有结果的屏幕(我正在显示结果 DatatSet 的第一个 DataTableDevExpress GridView
Screens

public static class ExcelHelperFasad
{
    /// <summary>
    /// Прочитать excel'евский файл и вернуть DataSet с заполненными DataTable'ами для каждой страницы.
    /// </summary>
    /// <param name="filename">Имя файла.</param>
    /// <returns></returns>
    public static DataSet OpenExcelFile(string filename)
    {
        if (File.Exists(filename) == false)
            throw new MyException("Файл не существует : " + filename);

        var dataTables = new List<DataTable>();

        var sheets = ListSheetInExcel(filename);

        if (sheets.Count == 0)
            throw new MyException("В Excel файле не найдено ни одной страницы. Проверьте файл на наличие страниц : " + filename);

        foreach (var sheet in sheets)
        {
            var dataTable = LoadWorksheetInDataTable(filename, sheet);

            dataTables.Add(dataTable);
        }

        var dataSet = new DataSet(Path.GetFileName(filename));

        foreach (var dataTable in dataTables)
            dataSet.Tables.Add(dataTable);

        return dataSet;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="sheetName"></param>
    /// <returns></returns>
    private static DataTable LoadWorksheetInDataTable(string fileName, string sheetName)
    {
        var sheetData = new DataTable(sheetName);
        using (var conn = ReturnConnection(fileName))
        {
            conn.Open();
            // retrieve the data using data adapter
            var sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
            sheetAdapter.Fill(sheetData);
        }
        return sheetData;
    }

    /// <summary>
    /// OLEDB коннекшон.
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    private static OleDbConnection ReturnConnection(string fileName)
    {
        return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\"");
    }

    /// <summary>
    /// Список страниц.
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    private static List<string> ListSheetInExcel(string filePath)
    {
        var sbConnection = new OleDbConnectionStringBuilder();
        var strExtendedProperties = string.Empty;
        sbConnection.DataSource = filePath;
        if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file
        {
            sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0";
            strExtendedProperties = "Excel 8.0;HDR=Yes;IMEX=1";//HDR=ColumnHeader,IMEX=InterMixed
        }
        else if (Path.GetExtension(filePath).Equals(".xlsx"))  //for 2007 Excel file
        {
            sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0";
            strExtendedProperties = "Excel 12.0;HDR=Yes;IMEX=1";
        }
        else
            throw new MyException("Ошибка чтения Excel файла. Необходимо сконвертировать Ваш файл в \".xlsx\" или \".xls\" формат.");

        sbConnection.Add("Extended Properties", strExtendedProperties);
        var listSheet = new List<string>();
        using (var conn = new OleDbConnection(sbConnection.ToString()))
        {
            conn.Open();
            var dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            foreach (DataRow drSheet in dtSheet.Rows)
            {
                if (drSheet["TABLE_NAME"].ToString().Contains("$"))//checks whether row contains '_xlnm#_FilterDatabase' or sheet name(i.e. sheet name always ends with $ sign)
                    listSheet.Add(drSheet["TABLE_NAME"].ToString());
            }
        }
        return listSheet;
    }
}

最佳答案

在 strExtendedProperties 中将“HDR”更改为“No”:

    if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file
    {
        sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0";
        strExtendedProperties = "Excel 8.0;HDR=No;IMEX=1";//HDR=ColumnHeader,IMEX=InterMixed
    }
    else if (Path.GetExtension(filePath).Equals(".xlsx"))  //for 2007 Excel file
    {
        sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0";
        strExtendedProperties = "Excel 12.0;HDR=No;IMEX=1";
    }
    else
        throw new MyException("Ошибка чтения Excel файла. Необходимо сконвертировать Ваш файл в \".xlsx\" или \".xls\" формат.");

否则,它将始终将第一行解释为列名。

关于C#读取excel文件忽略第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45350278/

相关文章:

c# - 在数据集中添加新行时检查重复项的最佳方法?

python - 如何从包含路径和标签的txt文件创建 tensorflow 数据集?

javascript - 如何在 C# 中的 Jint 中找到我的 javascript 函数?

C#:如何以编程方式将 SQL 脚本导入数据库?

Excel VBA : Unexpected result with Range and Cells

excel - 如何有条件地合并/连接 Excel 工作表?

c# - 从 C# 代码安装 npm 失败

c# - 如何在 Visual Studio 中调试期间查找当前订阅 WPF/C# 事件的所有方法

在 rstudio 中从 excel 中读取一张表

C#,循环遍历数据集并显示数据集列中的每条记录