C#读取excel文件忽略第一行
我正在使用OLEDB读取Excel
文件。 阅读后,我将其保存到DataSet
以备将来使用。
下面的代码工作得很好,但总是忽略 Excel
文件的第一行。 这怎么解决? 请忽略评论和例外的文本。 有结果的屏幕(我正在显示结果DatatSet
的第一个DataTable
到DevExpress
GridView
。
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(ie 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\" формат.");
否则,它总是将第一行解释为列名。
HDR = 1是问题,使HDR = 0 – 根据代码的意见,代码假设一个HEADER行,这将是一个行之前的数据标题 – 你的数据没有这个,这就是为什么第一行被跳过