none
新手问题操作EXcel,请给予帮忙 RRS feed

  • 问题

  •    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filname + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1'";
    
       string strSQL = "SELECT * FROM [sheet1$]";
    
       OleDbConnection excelConnection = new OleDbConnection(connectionString);
    
       excelConnection.Open();
    
       OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
    
       OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);
    
       System.Data.DataTable dTable = new System.Data.DataTable();
    
       dataAdapter.Fill(dTable);
    
       dataGridView1.DataSource = dTable;
    
       dTable.Dispose();
    
       dataAdapter.Dispose();
    
       dbCommand.Dispose();
    
       excelConnection.Close();
    
       excelConnection.Dispose();
    
    

     

    以上是读取Excel的代码 , 但是单元格合并后,值无法正确读取,那么合并后的单元格该如何赋值?

    2010年9月11日 17:26

答案

  • 不是需要在datagridview里面合并啊  是想把原来合并的拆开赋值

    就像你上面datagridview种F3列也赋值 2

     

    这样的话,在你填充完datatable后作一次遍历,像图中datagridview里那样,如果F3列位空,那就把F2列的值复制过来

    通用的方法是,如果当前列的值为空,那就把当前列-1的列值复制过来


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#


    那中间如果本该有空列呢……

    能不能告诉我如何如合并单元格坐上角坐标和值

    给个代码示例谢谢

        private DataTable Fill(DataTable dt)
        {
          for (int i = 0; i < dt.Rows.Count; i++)
          {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
              if (dt.Rows[i][j].ToString() == "" && dt.Rows[i][j - 1].ToString() != "" && j != 0)
              {
                dt.Rows[i][j] = dt.Rows[i][j - 1].ToString();
              }
            }
          }
          return dt;
        }
    
    
    //把datagridview赋值时,调用Fill方法
    
          dataAdapter.Fill(dTable);
    
          dataGridView1.DataSource = Fill(dTable);
    
          dTable.Dispose();
    


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    • 已标记为答案 ST211266 2010年9月13日 14:53
    2010年9月12日 5:29
  • 哪儿有-1列啊

    我加了条件  j != 0  防止出现-1列

    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    • 已标记为答案 ST211266 2010年9月12日 16:34
    • 取消答案标记 ST211266 2010年9月12日 16:34
    • 已标记为答案 ST211266 2010年9月13日 14:54
    2010年9月12日 14:32

全部回复

  •  

    这是我测试你的代码的效果,

    excel file B,C两2列合并了

     

    datagridview



    datagridview无法实现单元格的合并
    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    2010年9月12日 2:04
  • 不是需要在datagridview里面合并啊  是想把原来合并的拆开赋值

    就像你上面datagridview种F3列也赋值 2

     

    2010年9月12日 2:34
  • 不是需要在datagridview里面合并啊  是想把原来合并的拆开赋值

    就像你上面datagridview种F3列也赋值 2

     

    这样的话,在你填充完datatable后作一次遍历,像图中datagridview里那样,如果F3列位空,那就把F2列的值复制过来

    通用的方法是,如果当前列的值为空,那就把当前列-1的列值复制过来


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    2010年9月12日 4:53
  • 不是需要在datagridview里面合并啊  是想把原来合并的拆开赋值

    就像你上面datagridview种F3列也赋值 2

     

    这样的话,在你填充完datatable后作一次遍历,像图中datagridview里那样,如果F3列位空,那就把F2列的值复制过来

    通用的方法是,如果当前列的值为空,那就把当前列-1的列值复制过来


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#


    那中间如果本该有空列呢……

    能不能告诉我如何如合并单元格坐上角坐标和值

    给个代码示例谢谢

    2010年9月12日 5:21
  • 不是需要在datagridview里面合并啊  是想把原来合并的拆开赋值

    就像你上面datagridview种F3列也赋值 2

     

    这样的话,在你填充完datatable后作一次遍历,像图中datagridview里那样,如果F3列位空,那就把F2列的值复制过来

    通用的方法是,如果当前列的值为空,那就把当前列-1的列值复制过来


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#


    那中间如果本该有空列呢……

    能不能告诉我如何如合并单元格坐上角坐标和值

    给个代码示例谢谢

        private DataTable Fill(DataTable dt)
        {
          for (int i = 0; i < dt.Rows.Count; i++)
          {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
              if (dt.Rows[i][j].ToString() == "" && dt.Rows[i][j - 1].ToString() != "" && j != 0)
              {
                dt.Rows[i][j] = dt.Rows[i][j - 1].ToString();
              }
            }
          }
          return dt;
        }
    
    
    //把datagridview赋值时,调用Fill方法
    
          dataAdapter.Fill(dTable);
    
          dataGridView1.DataSource = Fill(dTable);
    
          dTable.Dispose();
    


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    • 已标记为答案 ST211266 2010年9月13日 14:53
    2010年9月12日 5:29
  • 哪儿有-1列啊

    2010年9月12日 6:12
  • 在哪里有比较完全关于操作Excel的学习资料 ,或者书籍
    2010年9月12日 6:21
  • 不知道以下的URL 能不能幫到你

    Microsoft.Office.Tools.Excel 命名空间
    http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel%28v=VS.80%29.aspx

    如何:通过使用 Visual C# 2010 功能访问 Office 互操作对象(C# 编程指南)
    http://msdn.microsoft.com/zh-cn/library/dd264733.aspx

    Please correct me if my concept is wrong


    Chi
    2010年9月12日 6:45
    版主
  • 哪儿有-1列啊

    我加了条件  j != 0  防止出现-1列

    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    • 已标记为答案 ST211266 2010年9月12日 16:34
    • 取消答案标记 ST211266 2010年9月12日 16:34
    • 已标记为答案 ST211266 2010年9月13日 14:54
    2010年9月12日 14:32
  • 谢谢你的帮助 问题已经解决了

    还有点小问题

    for (int r = 0; r <= es.UsedRange.Columns.Count; r++)
    {
       dataGridView1.Columns.Add("", "");
    }
    

    这里的UsedRange.Columns.Count读出来的列数与实际使用的列数不一样  表格中使用了6列 这个值却为17

    UsedRange.Rows.Count值没问题

    2010年9月12日 16:39