移动到右侧行,在c#中读取Excel文件

时间:2015-10-26 11:18:49

标签: c# excel parsing

我需要在不使用第三方库的情况下读取.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;
}

1 个答案:

答案 0 :(得分:1)

我创建并使用以下类来阅读.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返回。