移动到阅读Excel文件在C#
我需要阅读.xlsx文件,而不使用第三方库。
我这样做:
private void Upload(string filename) { FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read); // Reading from a OpenXml Excel file (2007 format; *.xlsx) IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); //DataSet - The result of each spreadsheet will be created in the result.Tables excelReader.IsFirstRowAsColumnNames = false; DataSet result = excelReader.AsDataSet(); //5. Data Reader methods string value = GetValue(0, 0, excelReader); //6. Free resources (IExcelDataReader is IDisposable) excelReader.Close(); }
我不知道如何阅读正确的单元格。 问题不是列位置(我可以使用,但是行位置。
public string GetValue(int row, int col, IExcelDataReader excelReader) { string s; // ??? how to positionate on the right row? s = excelReader(column_value); return s; }
我创build并使用以下类来读取.xlsx
或.xls
文件中的第一个工作表:
/// <summary> /// Reads a table from a spreadsheet. /// </summary> public sealed class XlsxReader { /// <summary> /// Loads an xlsx file from a filepath into the datatable. /// </summary> /// <param name="filePath"></param> /// <returns>Returns a DataTable with data from the first sheet.</returns> public static DataTable FromXLSX(string filePath) { try { // Create the new datatable. DataTable dtexcel = new DataTable(); // Define the SQL for querying the Excel spreadsheet. bool hasHeaders = true; string HDR = hasHeaders ? "Yes" : "No"; string strConn; // If it is a xlsx file if (filePath.Substring(filePath.LastIndexOf('.')).ToLower() == ".xlsx") strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=1;\""; else strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=1;\""; // Create connection OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); // Get scheme DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); DataRow schemaRow = schemaTable.Rows[0]; // Get sheet name string sheet = schemaRow["TABLE_NAME"].ToString(); if (!sheet.EndsWith("_")) { // Query data from the sheet string query = "SELECT * FROM [" + sheet + "]"; OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn); dtexcel.Locale = CultureInfo.CurrentCulture; // Fill the datatable. daexcel.Fill(dtexcel); } // Close connection. conn.Close(); // Set the datatable. return dtexcel; } catch { throw; } } }
它将DataTable
表作为DataTable
返回。