【问题标题】:Excel column name containing '.' converted to '#'包含“.”的 Excel 列名转换成 '#'
【发布时间】:2017-12-21 13:18:22
【问题描述】:

我正在导入一个 excel 文件并尝试将其导入 DataSet。问题是,如果列名包含.,例如导入后列名是Sr. No.,则DataSet 中显示的列名是Sr# No#

以下是代码:

public DataSet ConnectExcel(string filetable)
{
    DataSet ds = new DataSet(TABLE_NAME);
    string excelConnectionString;
    string extension = Path.GetExtension(filetable);

    if (extension == ".xls")
    {
        excelConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES\"", strCSVFilePath);
    }
    else
    {
         excelConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 xml;HDR=YES;\"", strCSVFilePath);
    }

    System.Data.OleDb.OleDbConnection oleDBCon = new System.Data.OleDb.OleDbConnection(excelConnectionString);

    try
    {
        if (oleDBCon.State == ConnectionState.Open)
        {
            //lblResult.Text = "file is in open state. Please close the file.";
        }
        else
        {
            oleDBCon.Open();
            DataTable Sheets = oleDBCon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
            foreach (DataRow dr in Sheets.Rows)
            {
                string sht = dr[2].ToString().Replace("'", "");
                System.Data.OleDb.OleDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sht + "]", oleDBCon);

                try
                {
                    dataAdapter.Fill(ds);
                    ds.Tables[0].TableName = TABLE_NAME;
                    ds.AcceptChanges();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                finally
                {
                    dataAdapter.Dispose();
                }
            }
        }
    }
    catch (Exception e) //Error
    {
        MessageBox.Show(e.Message);
    }
    finally
    {
        if (oleDBCon.State == ConnectionState.Open)
            oleDBCon.Close();
        oleDBCon.Dispose();
    }
    return ds;
}

【问题讨论】:

  • 如果稳定了可以再替换DataSet吗?
  • 您可以通过循环遍历每一列来替换数据表列名中的#
  • @satsvelke 为什么需要循环每个
  • @satsvelke @LeiYang 我让用户选择他们想要查看的文件,因此检查和替换 # 将不起作用,因为列名实际上可能包含 # 和我不应该只是把它改成.
  • @AdarshRavi 你可以使用connection.GetSchema("Tables") 知道真实的工作表名称。

标签: c# excel visual-studio-2013 datatable oledbdataadapter


【解决方案1】:

这里有几个选项。

在您的原始数据中,您可以将' 放在您不想转换的任何值之前。

您还可以单击 excel 电子表格中的每一列,并将其数据类型从常规更改为您想要的任何格式。

您的第三个选项是在您的连接字符串中使用IMEX=1

if (extension == ".xls")
{
    excelConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"", strCSVFilePath);
}
else
{
     excelConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 xml;HDR=YES;IMEX=1;\"", strCSVFilePath);
}

如果您在更改连接字符串后仍有问题,您将不得不将HDR 更改为NO 并将您的标题列也视为字符串。在这种情况下,您可以将列名替换为第一行中的数据(实际的列名),然后使用ds.Tables[0].Rows.RemoveAt(0);从数据表中删除第一行

【讨论】:

  • 我让用户选择他们想要访问的文件,然后我在 datagridview 上显示该文件。因此,对文件进行任何更改以获得所需的输出都是不可行的。 IMEX=1 没有帮助。并将HDR 更改为No 使我的第一列(我的标题列)变为普通数据单元格,这又不是我想要的。
  • 您必须选择其中之一。您始终可以选择制作标题文本并使用 `dt.Rows.RemoveAt(0);` 从数据表中删除第一行
  • @AdarshRavi:将列名拉入单独的数组,然后从数据表中删除public ExcelWorksheetHelper(DataTable oSrcData) { moDT = oSrcData; int iNumCols = moDT.Columns.Count; string [] masColumnNames = new string[iNumCols]; for (int i = 0; i < iNumCols; i++) masColumnNames[i] = moDT.Rows[0][i].ToString(); moDT.Rows.RemoveAt(0); }
猜你喜欢
  • 2020-03-27
  • 1970-01-01
  • 2010-09-22
  • 2020-06-24
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多