2017-07-27 170 views
1

我使用OLEDB读取Excel文件。阅读后,我将其保存到DataSet以供将来使用。C#读取excel文件忽略第一行

下面的代码工作得很好,但总是忽略Excel文件的第一行。 这怎么解决? 请忽略评论和例外的文本。 有结果的屏幕(我显示所导致DatatSet的第一DataTableDevExpressGridView 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; 
    } 
} 
+1

HDR = 1是HDR = 0的问题 - 根据代码上的代码注释,代码假定为HEADER行,这将是一行标题在数据之前 - 您的数据没有这个,并且这就是为什么第一行被跳过 – user230910

+0

@ user230910改变。现在它显示Excel文件第一行的第一列名称。 – KamikyIT

+0

没有必要检查文件扩展名并使用旧的提供程序和不同的扩展属性。带有Excel 12.0和Extended Property的Microsoft.ACE.OLEDB.12.0提供程序将会同时打开这两种文件类型。您应该避免使用Jet提供程序 –

回答

2

在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\" формат."); 

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

+0

现在它显示excel文件第一行的第一列名称。 – KamikyIT

+1

也许你的GridView没有设置为自动生成列? – MatSnow

0

HDR = 1是问题,使其HDR = 0 - 根据在代码中的注释该代码假设一个HEADER行,这将是一个行之前的数据标题 - 你的数据没有这个,这就是为什么第一行被跳过的原因

+0

现在,它显示Excel文件第一行的第一列名称。 – KamikyIT

+0

上面的屏幕截图不显示任何列名称? – user230910

+0

它确实,你可以看到它(列是灰色的,行是白色的)。 – KamikyIT