无法使用OLEDB将Excel打开到DataGridView? (_XLNM& $)

时间:2018-01-29 07:02:02

标签: c# excel datagridview

似乎我无法打开一些excel sheets来导入我的datagridview。

这些是list of my sheets

这是我的代码。

下面的代码是我的连接字符串。我正在使用OLEDB 12.0

        public static void ReadExcel(ComboBox cboSheet)
    {

       try
       {
           OpenFileDialog openFileDialog = new OpenFileDialog();
           openFileDialog.Filter = "Excel Files| *.xls; *xlsx";
           openFileDialog.ShowDialog();

           if (!string.IsNullOrEmpty(openFileDialog.FileName))
           {
               OleDbcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + openFileDialog.FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'");


               OleDbcon.Open();

               DataTable dt = OleDbcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

               OleDbcon.Close();

               cboSheet.Items.Clear();

               for (int i = 0; i < dt.Rows.Count; i++)
               {
                   String sheetName = dt.Rows[i]["Table_Name"].ToString();
                   sheetName = sheetName.Substring(0, sheetName.Length - 1);
                   cboSheet.Items.Add(sheetName);
               }
           }

       }

       catch (Exception e)
       {
           MessageBox.Show(e.ToString());

       }

    }

下面的代码用于将工作表导入我的组合框,一旦选中,将更改datagridview,包括列和行。

    public static void cboSheetSelected (DataGridView dataGridView1, ComboBox cboSheet, ComboBox cboColumn)
     {
         try
         {
             OleDbDataAdapter oleAdapt = new OleDbDataAdapter("Select * from [" + cboSheet.Text + "$]", ExcelMethods.OleDbcon);


             DataTable dt = new DataTable();

             oleAdapt.Fill(dt);

             dataGridView1.DataSource = dt;
             cboColumn.Items.Clear();

             foreach (DataColumn column in dt.Columns)
             {

                 Console.WriteLine(column.ColumnName);
                 cboColumn.Items.Add(column.ColumnName);

                 FileStream fs = new FileStream(@"C:\brandon\sample.txt", FileMode.OpenOrCreate, FileAccess.Write);
                 StreamWriter sw = new StreamWriter(fs);
                 sw.BaseStream.Seek(0, SeekOrigin.End);

                 sw.WriteLine(column.ColumnName);
                 //sw.WriteLine(column.Table.TableName + "" + "sample");

                 sw.Flush();
                 sw.Close();

                 //Console.WriteLine(column.Table);
             }

             foreach (DataRow row in dt.Rows)
             {
                 foreach (var item in row.ItemArray)
                 {
                     Console.WriteLine(item);
                     FileStream fs = new FileStream(@"C:\brandon\sample.txt", FileMode.OpenOrCreate, FileAccess.Write);
                     StreamWriter sw = new StreamWriter(fs);
                     sw.BaseStream.Seek(0, SeekOrigin.End);
                     sw.WriteLine(item);

                     sw.Flush();
                     sw.Close();
                 }
             }

         }

        catch (Exception e )
         {
             MessageBox.Show(e.ToString());
         }

     }

现在,为什么我不能打开一些床单呢?

我可以打开床单:

综合

分发

国内

财务

组织

生产

质量

很好。

我无法打开包含特殊字符的表格,例如“逗号和美元符号”。

请参阅此image

1 个答案:

答案 0 :(得分:-1)

编辑:

Excel使用户无法访问隐藏的工作表。它们被称为_xlnm_$_FilterDatabase

我的代码在上一次修订版中似乎有问题,所以我 更新

我无法访问所述表单的原因是因为它们包含空格并且具有特殊字符&#34; $&#34;和&#34; &#39; &#34; &lt; --- 撇号

工作表名称的结果是这样的。

  

xlnm _#_ FilterDatabas

     

xlnm _#_ FilterDatabas

     

xlnm _#_ FilterDatabas

     

xlnm _#_ FilterDatabas

     

xlnm _# FilterDatabase

     

xlnm _#_ FilterDatabase_1

     

xlnm _#_ FilterDatabase_1

     

xlnm _# FilterDatabase

     

xlnm _#_ _ FilterDatabase_2

     

xlnm _# FilterDatabase

     

xlnm _#_ _ FilterDatabase_3

     

xlnm _# FilterDatabase

     

&#39; AR Aging $

     

&#39; By Brands - SMS $

     

&#39; By Brands $

     

&#39;按地区或渠道$

     

综合

     

分发

     

国内

     

财务

     

组织

     

生产

     

质量

     

&#39;工作资金$

就是这样,因为我已经使用了这段代码:sheetName = sheetName.Substring(0, sheetName.Length - 1);而且我已经用&#34; $&#34;忽略了所有的工作表名称。使用此

    if (!dt.Rows[i]["Table_Name"].ToString().Contains("FilterDatabase") && !dt.Rows[i]["Table_Name"].ToString().EndsWith("$'"))
{
}

特别是dt.Rows[i]["Table_Name"].ToString().EndsWith("$'")),以便它可以忽略带有&#34; $&#34;在它上面的标志因此使空格的表格无法访问。

我已使用此代码解决此问题:

 sheetName = sheetName.Replace(@"'", "");
 sheetName = sheetName.Replace("$", "");

通过使用上面的代码,名为'By Territory or Channel$的sheetName将变为By Territory or Channel

因此,当它们被引用时,它看起来就像这样。

  OleDbDataAdapter oleAdapt = new OleDbDataAdapter("Select * from [" + sheetName + "$]", ExcelMethods.OleDbcon)