加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

datagridview复制、剪切、粘贴、清空、增加行、删除行、增加列、删除列,导出Excel/Word

(2015-08-31 15:48:47)
标签:

it

分类: 编程一点

1.导入Excel。代码走先。

 

  1. public void ExcelToDataGridView(string filePath, DataGridView dataGridView1)  
  2.        
  3.           //根据路径打开一个Excel文件并将数据填充到DataSet中
      
  4.           string strConn "Provider Microsoft.Jet.OLEDB.4.0; Data Source " filePath "; Extended Properties 'Excel 8.0;HDR =YES; IMEX=2'" 
  5.           // 导入时包含Excel中的第一行数据,并且将数字和字符混合的单元格视为文本进行导入
      
  6.           OleDbConnection conn new OleDbConnection(strConn);  
  7.           conn.Open();  
  8.           string strExcel "select from [sheet1$]" 
  9.           OleDbDataAdapter myCommand new OleDbDataAdapter(strExcel, strConn);  
  10.           ds new DataSet();  
  11.           myCommand.Fill(ds, "[Sheet1$]");  
  12.           dataGridView1.DataMember "[Sheet1$]" 
  13.           dataGridView1.DataSource ds;  
  14.           conn.Close();  
  15.           dataGridView1.AllowUserToAddRows true 
  16.           //禁用自动排序
      
  17.           for (int k= 0;k dataGridView1.Columns.Count; k++)  
  18.            
  19.               dataGridView1.Columns[k].SortMode DataGridViewColumnSortMode.NotSortable;  
  20.            
  21.   
  22.           int cCount dataGridView1.ColumnCount;  
  23.           int rCount dataGridView1.RowCount;  
  24.           double[,] array new double[rCount, cCount];  
  25.           for (int 0; rCount 1; j++)                               // 逐行遍历
      
  26.            
  27.               for (int 0; cCount 1; i++)                          // 逐列遍历
      
  28.                
  29.                   array[j, i] Convert.ToDouble(dataGridView1.Rows[j].Cells[i].Value.ToString());  
  30.                
  31.            
  32.        
  1.   private void button1_Click(object sender, EventArgs e)  
  2.          
  3.             // 打开一个选择框
      
  4.             OpenFileDialog ofd new OpenFileDialog();  
  5.             ofd.Title "Excel文件" 
  6.             ofd.FileName "" 
  7.             ofd.InitialDirectory Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);  
  8.             ofd.Filter "Excel文件(*.xls)|*.xls" 
  9.             ofd.ValidateNames true           // 文件有效性验证vValidateNames,验证用户输入的是否是一个有效的windows 文件名
      
  10.             ofd.CheckFileExists true          // 验证文件的有效性
      
  11.             ofd.CheckPathExists true       // 验证路径的有效性
      
  12.             strName string.Empty;  
  13.             if (ofd.ShowDialog() == DialogResult.OK)  
  14.              
  15.                 strName ofd.FileName;  
  16.              
  17.             if (strName == "" 
  18.              
  19.                 MessageBox.Show("没有选择Excel文件!无法进行数据导入");  
  20.                 return 
  21.              
  22.             DgvSet EtG new DgvSet();  
  23.             EtG.ExcelToDataGridView(strName, this.dataGridView1);  
  24.          

用此方法导入Excel最为方便,注意需要命名空间using System.Data.OleDb;


2.我遇到最大的难题就是插入行,因为此导入Excel方法会绑定数据源,当你用代码插入时总会提示“当控件与数据源绑定时,无法以编程方式向其中添加行”,最后得以高手帮助,搞定。见代码。

 

  1. public void AddExcelToDataGridView(DataGridView dataGridView1, int index)  
  2.         
  3.                dataGridView1.DataBindings.Clear();  
  4.                DataRow row row ds.Tables[0].NewRow();  
  5.                ds.Tables[0].Rows.InsertAt(row, index);  
  6.                dataGridView1.DataSource ds;  
  7.                dataGridView1.AllowUserToAddRows true 
  8.         
  1. //datagridview右键功能
      
  2.  private void 插入行ToolStripMenuItem_Click(object sender, EventArgs e)  
  3.          
  4.             try  
  5.              
  6.                 //MessageBox.Show(dataGridView1.CurrentRow.Index.ToString());
      
  7.                 DgvSet EtG new DgvSet();  
  8.                 EtG.AddExcelToDataGridView( this.dataGridView1,  dataGridView1.CurrentRow.Index);  
  9.                 //this.dataGridView1.Rows.Insert(dataGridView1.CurrentRow.Index, 1);
      
  10.                 //this.dataGridView1.Rows.Insert(dataGridView1.CurrentRow.Index, new DataGridViewRow());
      
  11.              
  12.             catch (Exception ex)  
  13.              
  14.                 MessageBox.Show(ex.Message.ToString());  
  15.              
  16.          

 


3.就是datagridview单元格为空问题,而datagridview单元格为空不能使用NULL,应使用DBNull.Value;如下:

  1. public void Clear(DataGridView dataGridView1)  
  2.        
  3.           foreach (DataGridViewCell cell in dataGridView1.SelectedCells)  
  4.            
  5.               cell.Value DBNull.Value;  
  6.            
  7.        

4.另一个较复杂问题就是粘贴,,粘贴不仅要能够从外面的Excel复制在datagridview粘贴,本身datagridview还要能够复制粘贴,而且,当复制行列数超过datagridview总行列数时,datagridview还要能够自动增加行与列。代码

 

  1. #region 粘贴
      
  2.         public int Paste(DataGridView dgv, string pasteText, int kind, bool b_cut)  
  3.          
  4.             try  
  5.              
  6.                 if (kind == 0)  
  7.                  
  8.                     pasteText Clipboard.GetText();  
  9.                  
  10.                 if (string.IsNullOrEmpty(pasteText))  
  11.                     return -1;  
  12.                 int rowNum 0;  
  13.                 int columnNum 0;  
  14.                 //获得当前剪贴板内容的行、列数
      
  15.                 for (int 0; pasteText.Length; i++)  
  16.                  
  17.                     if (pasteText.Substring(i, 1) == "\t" 
  18.                      
  19.                         columnNum++;  
  20.                      
  21.                     if (pasteText.Substring(i, 1) == "\n" 
  22.                      
  23.                         rowNum++;  
  24.                      
  25.                  
  26.                 Object[,] data;  
  27.                 //粘贴板上的数据来自于EXCEL时,每行末都有\n,在DATAGRIDVIEW内复制时,最后一行末没有\n
      
  28.                 if (pasteText.Substring(pasteText.Length 1, 1) == "\n" 
  29.                  
  30.                     rowNum rowNum 1;  
  31.                  
  32.                 columnNum columnNum (rowNum 1);  
  33.                 data new object[rowNum 1, columnNum 1];  
  34.   
  35.                 String rowStr;  
  36.                 //对数组赋值
      
  37.                 for (int 0; (rowNum 1); i++)  
  38.                  
  39.                     for (int colIndex 0; colIndex (columnNum 1); colIndex++)  
  40.                      
  41.                         rowStr null 
  42.                         //一行中的最后一列
      
  43.                         if (colIndex == columnNum && pasteText.IndexOf("\r"!= -1)  
  44.                          
  45.                             rowStr pasteText.Substring(0, pasteText.IndexOf("\r"));  
  46.                          
  47.                         //最后一行的最后一列
      
  48.                         if (colIndex == columnNum && pasteText.IndexOf("\r"== -1)  
  49.                          
  50.                             rowStr pasteText.Substring(0);  
  51.                          
  52.                         //其他行列
      
  53.                         if (colIndex != columnNum)  
  54.                          
  55.                             rowStr pasteText.Substring(0, pasteText.IndexOf("\t"));  
  56.                             pasteText pasteText.Substring(pasteText.IndexOf("\t"1);  
  57.                          
  58.                         if (rowStr == string.Empty)  
  59.                             rowStr null 
  60.                         data[i, colIndex] rowStr;  
  61.                      
  62.                     //截取下一行数据
      
  63.                     pasteText pasteText.Substring(pasteText.IndexOf("\n"1);  
  64.                  
  65.                   
  66.                   
  67.                 int columnindex -1, rowindex -1;  
  68.                 int columnindextmp -1, rowindextmp -1;  
  69.                 if (dgv.SelectedCells.Count != 0)  
  70.                  
  71.                     columnindextmp dgv.SelectedCells[0].ColumnIndex;  
  72.                     rowindextmp dgv.SelectedCells[0].RowIndex;  
  73.                  
  74.                 //取到最左上角的 单元格编号
      
  75.                 foreach (DataGridViewCell cell in dgv.SelectedCells)  
  76.                  
  77.                     //dgv.Rows[cell.RowIndex].Selected true;
      
  78.                     columnindex cell.ColumnIndex;  
  79.                     if (columnindex columnindextmp)  
  80.                      
  81.                         //交换
      
  82.                         columnindex columnindextmp;  
  83.                      
  84.                     else  
  85.                         columnindextmp columnindex;  
  86.                     rowindex cell.RowIndex;  
  87.                     if (rowindex rowindextmp)  
  88.                      
  89.                         rowindex rowindextmp;  
  90.                         rowindextmp rowindex;  
  91.                      
  92.                     else  
  93.                         rowindextmp rowindex;  
  94.                  
  95.                 if (kind == -1)  
  96.                  
  97.                     columnindex 0;  
  98.                     rowindex 0;  
  99.                  
  100.   
  101.                 //如果行数超过当前列表行数
      
  102.                 if (rowindex rowNum dgv.RowCount)  
  103.                  
  104.                     int mm rowNum rowindex dgv.RowCount;  
  105.                     for (int ii 0; ii mm+1; ii++)  
  106.                      
  107.                         dgv.DataBindings.Clear();  
  108.                         DataRow row row ds.Tables[0].NewRow();  
  109.                         ds.Tables[0].Rows.InsertAt(row, ii rowindex 1);  
  110.                      
  111.                  
  112.   
  113.                 //如果列数超过当前列表列数
      
  114.                 if (columnindex columnNum dgv.ColumnCount)  
  115.                  
  116.                     int mmm columnNum columnindex dgv.ColumnCount;  
  117.                     for (int iii= 0; iii mmm; iii++)  
  118.                      
  119.                         dgv.DataBindings.Clear();  
  120.                         DataGridViewTextBoxColumcolum new DataGridViewTextBoxColumn();  
  121.                       dgv.Columns.Insert(columnindex+1, colum);  
  122.                      
  123.                  
  124.   
  125.                 //增加超过的行列
      
  126.                 for (int 0; (rowNum 1); j++)  
  127.                  
  128.                     for (int colIndex 0; colIndex (columnNum 1); colIndex++)  
  129.                      
  130.                         if (colIndex columnindex dgv.Columns.Count)  
  131.                          
  132.                             if (dgv.Columns[colIndex columnindex].CellType.Name == "DataGridViewTextBoxCell" 
  133.                              
  134.                                 if (dgv.Rows[j rowindex].Cells[colIndex columnindex].ReadOnly == false 
  135.                                  
  136.                                     dgv.Rows[j rowindex].Cells[colIndex columnindex].Value data[j, colIndex];  
  137.                                     dgv.Rows[j rowindex].Cells[colIndex columnindex].Selected true 
  138.                                  
  139.                              
  140.                          
  141.                      
  142.                          
  143.                 //清空剪切板内容
      
  144.                 if (b_cut)  
  145.                     Clipboard.Clear();  
  146.                 return 1;  
  147.              
  148.             catch  
  149.              
  150.                 return -1;  
  151.              
  152.          
  153.         #endregion  

5.另外,因为datagridview无法编辑第一列,当插入列时,就无法在datagridview上编辑,只能增加列时就自动传一个列名,我是这样做的:

 

  1. private void 插入列ToolStripMenuItem_Click(object sender, EventArgs e)  
  2.             
  3.             try   
  4.              
  5.             DataGridViewTextBoxColumcolumn new DataGridViewTextBoxColumn();  
  6.             int columnindex dataGridView1.CurrentRow.Cells.IndexOf(dataGridView1.CurrentCell);  
  7.              
  8.             string newName "New" (k++);  
  9.             column.HeaderText =newName;  
  10.             //column.AutoSizeMode DataGridViewAutoSizeColumnMode.DisplayedCells;
      
  11.             //column.CellTemplate.Style.BackColor Color.Beige;
      
  12.             dataGridView1.Columns.Insert(columnindex 1, column);  
  13.              
  14.                 catch(Exception error)  
  15.              
  16.                 MessageBox.Show(error.Message);  
  17.                          
  18.          

6.其他的代码就不一一上传了,只把主要的问题和代码上传,有需要的邮件给我,我传给你。

第一次发这么长的,求人品。。。。。。。。

(附图,有图有真相,见下):http://my.csdn.net/uploads/201208/20/1345429668_7895.png


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有