【问题标题】:Reading Excel in c# where some columns are empty在 C# 中读取某些列为空的 Excel
【发布时间】:2016-01-28 03:05:12
【问题描述】:

我有一个这样的 Excel 模板

我在阅读这篇文章时遇到了一些问题(我不能使用第 3 方库)。我的解决方案:

public partial class CaricaDocumento : System.Web.UI.Page
{

    static string HDR; // "Yes" indicates that the first row contains column names, not data
    Regex regex = new Regex("([0-9]+)(.*)");


    protected void Page_Load(object sender, EventArgs e)
    {
        string ind = "C:\\My_Template.xlsx";
        string sheetName = "Page1";

        DataTable dt = FromXLSX(ind, sheetName, true); 

        DataToView(dt);
    }


    // Bind data to the page
    private void DataToView(DataTable dt)
    {
        LblFattura.Text = GetValue("AO10", dt);
        LblDataFattura.Text = GetValue("AX10", dt);
        LblCognomeOrRagioneSociale.Text = GetValue("B18", dt);
        LblNome.Text = GetValue("AB18", dt);
    }


    // return the value from the cell, indicate a code like "A1", "B3", "AO10"...
    public string GetValue(string codeCell, DataTable dt)
    {
        string[] substrings = regex.Split(codeCell);
        string letterString = substrings[0]; // 'A' or 'B' ... 'AZ' ... 
        int letter = ColumnLetterToNumber(letterString); // transform the letter in a column index

        int num = 1;
        if (HDR == "Yes")
            num = 2;

        // if the first row is an header, do -2
        // if the first row is a simple data row, do -1
        int number = Int32.Parse(substrings[1]) - num; // the right row index
        return dt.Rows[number][letter].ToString();
    }


    //  transform the letter in a column index
    public static int ColumnLetterToNumber(string columnName)
    {
        if (string.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName");

        columnName = columnName.ToUpperInvariant();

        int sum = 0;
        for (int i = 0; i < columnName.Length; i++)
        {
            sum *= 26;
            char letter = columnName[i];
            sum += (letter - ('A' - 1));
        }
        sum--;
        return sum;
    }


    // return the DataTable
    public static DataTable FromXLSX(string filePath, string sheet, bool hasHeaders)
    {
        try
        {
            // Create the new datatable.
            DataTable dtexcel = new DataTable();

            // Define the SQL for querying the Excel spreadsheet.
            HDR = hasHeaders ? "Yes" : "No"; // "HDR=Yes;" indicates that the first row contains column names, not data
            string IMEX = "1";

            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath 
                    + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=" + IMEX + ";\"";

            // Create connection:
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();

            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; }
    }
}

但我注意到了这个问题:如果数据不是从“A”列开始,DataTable 会从第一列中读取数据!是索引的噩梦。例如:

...在这种情况下,“A”列被忽略(DataTable 从“B”开始获取数据),这使单元格代码的使用无效(如“A1”、“B5”、“AO11”.. .) 因为方法ColumnLetterToNumber(string columnName) 被扭曲了。

有人知道我如何强制 DataTable 从“A”列开始获取数据吗?或者使用单元格代码从 Excel 获取数据的其他方法?

【问题讨论】:

  • 您能否修改模板,只需在 A1 列的某处放置一个“隐藏”值(即:白色单元格中的一个白点)?
  • 很遗憾,不是。模板由其他提供

标签: c# excel datatable


【解决方案1】:

你可以使用这个查询:

string query = "SELECT NULL AS EmptyColumn, * FROM [" + sheet + "$]";

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多