• C# 实现复制Excel内容到DataGridview中


    业务要求:复制:将Excel内容复制到datagridview中

    最终效果:复制Excel内容,点击datagridview中的某个单元格,顺着这个单元格自动填充自动增加行。偷懒了,没写填充在选择哪些行就填充到哪些行。

    1、添加方法

     1 #region     
     2    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
     3         {
     4 //回车新增行  个人笔记
     5             switch (keyData)
     6             {
     7 
     8                 case System.Windows.Forms.Keys.Enter:
     9                     {
    10  
    11                         if (this.Text.IndexOf("订单") > -1)
    12                         {
    13                             try
    14                             {
    15                                 if (edcol > 0 && edrow == dsMainFilter1.Tables[0].Rows.Count - 1)
    16                                 {
    17 
    18                                     DataRow row = dsMainFilter1.Tables[0].NewRow();
    19                                     str = SYSVARS.vars.userId + System.DateTime.Now.ToString("yyyyMMddHHmmss").ToString().Trim() + dsMainFilter1.Tables[0].Rows.Count.ToString();//以时间标识代码不同的单据号
    
    28                                     dsMainFilter1.Tables[0].Rows.Add(row);
    29                                 }
    30 
    31                                 this.dataGridView3.CurrentCell = dataGridView3[3, dsMainFilter1.Tables[0].Rows.Count - 1];
    32                                 dataGridView3.BeginEdit(true);
    33                             }
    34                             catch { }
    35                         }
    36                     }
    41 
    42                     return true;
    43             }
    44 
    45             #region excel复制粘贴功能
    46             try
    47             {
    48                 if (this.Text.IndexOf("订单")>-1)
    49                 {
    50                     if (keyData == (Keys.V | Keys.Control))  // ctrl+V
    51                     {
    52                         bool bd = dataGridView3.Focus();//避免影响到界面上其他功能使用粘贴
    53                         if (bd == true)
    54                         {
    55                             IDataObject idataObject = Clipboard.GetDataObject();
    56                             string da = Clipboard.GetText();
    57                             string[] s = idataObject.GetFormats();
    58                             copydata(da);
    59                             return true;//很重要,不写将会把所有值填充在最后一个单元格里面
    60                         }
    61                         
    62                     }
    63                 }
    64             }
    65             catch { }
    66             #endregion
    67             return base.ProcessCmdKey(ref msg, keyData);
    68         }
    69         #endregion

    2、处理剪切板的数据 

     private void copydata(string data1) {
                string clipboardText = Clipboard.GetText(); //获取剪贴板中的内容
                       
                if (data1.Trim().Length < 1) { return; }
                try {
                    int colnum = 0;
                    int rownum = 0;
                    for (int i = 0; i < clipboardText.Length; i++)
                    {
                        if (clipboardText.Substring(i, 1).Equals("	"))
                        {
                            colnum++;
                        }
                        if (clipboardText.Substring(i, 1).Equals("
    "))
                        {
                            rownum++;
                        }
                    }
                    //粘贴板上的数据来源于EXCEL时,每行末尾都有
    ,来源于DataGridView是,最后一行末尾没有
    
                    if (clipboardText.Substring(clipboardText.Length - 1, 1) == "
    ")
                    {
                        rownum--;
                    }
                    colnum = colnum / (rownum + 1);
                    object[,] data; //定义object类型的二维数组
                    data = new object[rownum + 1, colnum + 1];  //根据剪贴板的行列数实例化数组
                    string rowStr = "";
                    //对数组各元素赋值
                    for (int i = 0; i <= rownum; i++)
                    {
                        for (int j = 0; j <= colnum; j++)
                        {
                            //一行中的其它列
                            if (j != colnum)
                            {
                                rowStr = clipboardText.Substring(0, clipboardText.IndexOf("	"));
                                clipboardText = clipboardText.Substring(clipboardText.IndexOf("	") + 1);
                            }
                            //一行中的最后一列
                            if (j == colnum && clipboardText.IndexOf("
    ") != -1)
                            {
                                rowStr = clipboardText.Substring(0, clipboardText.IndexOf("
    "));
                            }
                            //最后一行的最后一列
                            if (j == colnum && clipboardText.IndexOf("
    ") == -1)
                            {
                                rowStr = clipboardText.Substring(0);
                            }
                            data[i, j] = rowStr;
                        }
                        //截取下一行及以后的数据
                        clipboardText = clipboardText.Substring(clipboardText.IndexOf("
    ") + 1);
                    }
                    clipboardText = Clipboard.GetText();
                    int start, end = -1, index, rowStart = 0, columnStart = 0;
                    
                    rowStart = r;//选中单元格的行号
                    columnStart = Icol;//选中单元格的列号
    
                    for (int i = 0; i <=rownum; i++)
                    {
                        #region 如果datagridview中行数不够,就自动增加行
                        if ((i + rowStart) > dataGridView3.Rows.Count - 1)
                        {
                  //添加新行            
    DataRow row
    = dsMainFilter1.Tables[0].NewRow(); str = SYSVARS.vars.userId + System.DateTime.Now.ToString("yyyyMMddHHmmss").ToString().Trim() + dsMainFilter1.Tables[0].Rows.Count.ToString();//以时间标识代码不同的单据号 dsMainFilter1.Tables[0].Rows.Add(row); } #endregion for (int j = 0; j <= colnum; j++)//将值赋值过去---如果datagridview中没有自动增加列 { #region 需要判断单元格是不是只读的,是只读的就不用不赋值 bool iszd = this.dataGridView3.Rows[i + rowStart].Cells[j + columnStart].ReadOnly; if (iszd == true) { continue; } #endregion string sjz = ""; try { sjz = data[i, j].ToString(); } catch { sjz = ""; } if (sjz.Trim().Length < 1) { continue; }//直接复制this.dataGridView3.Rows[i + rowStart].Cells[j + columnStart].Value = sjz; } } } catch { } }
  • 相关阅读:
    jquery ajax 显示服务器时钟
    盒子阴影
    排版问题,div nav 里面包含的内容没有在其范围内
    jquery点击向右,点击向左
    juqery 点击显示点击隐藏,slideDown slideUp slideToggle
    css强制换行
    jquery动画
    R17下maps新增参数的问题
    现阶段github上的emysql编译无法通过的问题
    之前数据库读写模型的实现
  • 原文地址:https://www.cnblogs.com/luo1240465012/p/10010252.html
Copyright © 2020-2023  润新知