datagridview复制、剪切、粘贴、清空、增加行、删除行、增加列、删除列,导出Excel/Word
标签:
it |
分类: 编程一点 |
1.导入Excel。代码走先。
-
public
void ExcelToDataGridView( stringfilePath, DataGridView dataGridView1) -
{ -
//根据路径打开一个Excel文件并将数据填充到DataSet中
-
stringstrConn "Provider= = Microsoft.Jet.OLEDB.4.0; Data Source = " + ";filePath + Extended ;Properties = 'Excel 8.0;HDR =YES; IMEX=2'" -
//导入时包含Excel中的第一行数据,并且将数字和字符混合的单元格视为文本进行导入
-
newOleDbConnection conn = OleDbConnection(strConn); -
conn.Open(); -
stringstrExcel "select= * ;from [sheet1$]" -
newOleDbDataAdapter myCommand = OleDbDataAdapter(strExcel, strConn); -
newds = DataSet(); -
"[Sheet1$]");myCommand.Fill(ds, -
"[Sheet1$]";dataGridView1.DataMember = -
dataGridView1.DataSource = ds; -
conn.Close(); -
true;dataGridView1.AllowUserToAddRows = -
//禁用自动排序
-
for( intk= 0;k < dataGridView1.Columns.Count; k++) -
{ -
dataGridView1.Columns[k].SortMode = DataGridViewColumnSortMo de.NotSortable; -
} -
-
intcCount = dataGridView1.ColumnCount; -
intrCount = dataGridView1.RowCount; -
double[,]array new= double[rCount, cCount]; -
for( intj //= 0; j < rCount - 1; j++) 逐行遍历
-
{ -
for( inti //= 0; i < cCount - 1; i++) 逐列遍历
-
{ -
array[j, i] = Convert.ToDouble(dataGridView1.Rows[j].Cells[i].Value.ToString()); -
} -
} -
}
-
privatevoid button1_Click( objectsender, EventArgs e) -
{ -
//打开一个选择框
-
newOpenFileDialog ofd = OpenFileDialog(); -
"Excel文件";ofd.Title = -
"";ofd.FileName = -
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); -
"Excel文件(*.xls)|*.xls";ofd.Filter = -
true;ofd.ValidateNames = //文件有效性验证vValidateNames,验证用户输入的是否是一个有效的windows 文件名
-
true;ofd.CheckFileExists = //验证文件的有效性
-
true;ofd.CheckPathExists = //验证路径的有效性
-
string.Empty;strName = -
if(ofd.ShowDialog() == DialogResult.OK) -
{ -
strName = ofd.FileName; -
} -
if(strName "")== -
{ -
"没有选择Excel文件!无法进行数据导入");MessageBox.Show( -
return; -
} -
newDgvSet EtG = DgvSet(); -
this.dataGridView1);EtG.ExcelToDataGridView(strName, -
}
用此方法导入Excel最为方便,注意需要命名空间using System.Data.OleDb;
2.我遇到最大的难题就是插入行,因为此导入Excel方法会绑定数据源,当你用代码插入时总会提示“当控件与数据源绑定时,无法以编程方式向其中添加行”,最后得以高手帮助,搞定。见代码。
-
public
void AddExcelToDataGridView(DataGridView intdataGridView1, index) -
{ -
dataGridView1.DataBindings.Clear(); -
DataRow row = row = ds.Tables[0].NewRow(); -
ds.Tables[0].Rows.InsertAt(row, index); -
dataGridView1.DataSource = ds; -
true;dataGridView1.AllowUserToAddRows = -
}
-
//datagridview右键功能
-
private void 插入行ToolStripMenuItem_Click( objectsender, EventArgs e) -
{ -
try -
{ -
//MessageBox.Show(dataGridView1.CurrentRow.Index.ToString());
-
newDgvSet EtG = DgvSet(); -
this.dataGridView1,EtG.AddExcelToDataGridView( dataGridView1.CurrentRow.Index); -
//this.dataGridView1.Rows.Insert(dataGridView1.CurrentRow.Index,1);
-
//this.dataGridView1.Rows.Insert(dataGridView1.CurrentRow.Index,new DataGridViewRow());
-
} -
catch(Exception ex) -
{ -
MessageBox.Show(ex.Message.ToString()); -
} -
}
3.就是datagridview单元格为空问题,而datagridview单元格为空不能使用NULL,应使用DBNull.Value;如下:
-
public
void Clear(DataGridView dataGridView1) -
{ -
foreach(DataGridViewCell incell dataGridView1.SelectedCells) -
{ -
cell.Value = DBNull.Value; -
} -
}
4.另一个较复杂问题就是粘贴,,粘贴不仅要能够从外面的Excel复制在datagridview粘贴,本身datagridview还要能够复制粘贴,而且,当复制行列数超过datagridview总行列数时,datagridview还要能够自动增加行与列。代码
-
#region
粘贴 -
publicint Paste(DataGridView stringdgv, pasteText, intkind, boolb_cut) -
{ -
try -
{ -
if(kind == 0) -
{ -
pasteText = Clipboard.GetText(); -
} -
if( string.IsNullOrEmpty(pasteText)) -
return-1; -
introwNum = 0; -
intcolumnNum = 0; -
//获得当前剪贴板内容的行、列数
-
for( inti = 0; i < pasteText.Length; i++) -
{ -
if(pasteText.Substring(i, "\t")1) == -
{ -
columnNum++; -
} -
if(pasteText.Substring(i, "\n")1) == -
{ -
rowNum++; -
} -
} -
Object[,] data; -
//粘贴板上的数据来自于EXCEL时,每行末都有\n,在DATAGRIDVIEW内复制时,最后一行末没有\n
-
if(pasteText.Substring(pasteText.Length "\n")- 1, 1) == -
{ -
rowNum = rowNum - 1; -
} -
columnNum = columnNum / (rowNum + 1); -
newdata = object[rowNum + 1, columnNum + 1]; -
-
String rowStr; -
//对数组赋值
-
for( inti = 0; i < (rowNum + 1); i++) -
{ -
for( intcolIndex = 0; colIndex < (columnNum + 1); colIndex++) -
{ -
null;rowStr = -
//一行中的最后一列
-
if(colIndex "\r")== columnNum && pasteText.IndexOf( != -1) -
{ -
"\r"));rowStr = pasteText.Substring(0, pasteText.IndexOf( -
} -
//最后一行的最后一列
-
if(colIndex "\r")== columnNum && pasteText.IndexOf( == -1) -
{ -
rowStr = pasteText.Substring(0); -
} -
//其他行列
-
if(colIndex != columnNum) -
{ -
"\t"));rowStr = pasteText.Substring(0, pasteText.IndexOf( -
"\t")pasteText = pasteText.Substring(pasteText.IndexOf( + 1); -
} -
if(rowStr string.Empty)== -
null;rowStr = -
data[i, colIndex] = rowStr; -
} -
//截取下一行数据
-
"\n")pasteText = pasteText.Substring(pasteText.IndexOf( + 1); -
} -
-
-
intcolumnindex = -1, rowindex = -1; -
intcolumnindextmp = -1, rowindextmp = -1; -
if(dgv.SelectedCells.Count != 0) -
{ -
columnindextmp = dgv.SelectedCells[0].ColumnIndex; -
rowindextmp = dgv.SelectedCells[0].RowIndex; -
} -
//取到最左上角的单元格编号
-
foreach(DataGridViewCell incell dgv.SelectedCells) -
{ -
//dgv.Rows[cell.RowIndex].Selected= true;
-
columnindex = cell.ColumnIndex; -
if(columnindex > columnindextmp) -
{ -
//交换
-
columnindex = columnindextmp; -
} -
else -
columnindextmp = columnindex; -
rowindex = cell.RowIndex; -
if(rowindex > rowindextmp) -
{ -
rowindex = rowindextmp; -
rowindextmp = rowindex; -
} -
else -
rowindextmp = rowindex; -
} -
if(kind == -1) -
{ -
columnindex = 0; -
rowindex = 0; -
} -
-
//如果行数超过当前列表行数
-
if(rowindex + rowNum + 1 > dgv.RowCount) -
{ -
intmm = rowNum + rowindex + 1 - dgv.RowCount; -
for( intii = 0; ii < mm+1; ii++) -
{ -
dgv.DataBindings.Clear(); -
DataRow row = row = ds.Tables[0].NewRow(); -
ds.Tables[0].Rows.InsertAt(row, ii + rowindex + 1); -
} -
} -
-
//如果列数超过当前列表列数
-
if(columnindex + columnNum + 1 > dgv.ColumnCount) -
{ -
intmmm = columnNum + columnindex + 1 - dgv.ColumnCount; -
for( intiii= 0; iii < mmm; iii++) -
{ -
dgv.DataBindings.Clear(); -
newDataGridViewTextBoxColum n colum = DataGridViewTextBoxColum n(); -
dgv.Columns.Insert(columnindex+1, colum); -
} -
} -
-
//增加超过的行列
-
for( intj = 0; j < (rowNum + 1); j++) -
{ -
for( intcolIndex = 0; colIndex < (columnNum + 1); colIndex++) -
{ -
if(colIndex + columnindex < dgv.Columns.Count) -
{ -
if(dgv.Columns[colIndex "DataGridViewTextBoxCell")+ columnindex].CellType.Name == -
{ -
if(dgv.Rows[j false)+ rowindex].Cells[colIndex + columnindex].ReadOnly == -
{ -
dgv.Rows[j + rowindex].Cells[colIndex + columnindex].Value = data[j, colIndex]; -
true;dgv.Rows[j + rowindex].Cells[colIndex + columnindex].Selected = -
} -
} -
} -
} -
} -
//清空剪切板内容
-
if(b_cut) -
Clipboard.Clear(); -
return1; -
} -
catch -
{ -
return-1; -
} -
} -
#endregion
5.另外,因为datagridview无法编辑第一列,当插入列时,就无法在datagridview上编辑,只能增加列时就自动传一个列名,我是这样做的:
-
private
void 插入列ToolStripMenuItem_Click( objectsender, EventArgs e) -
{ -
try -
{ -
newDataGridViewTextBoxColum n column = DataGridViewTextBoxColum n(); -
intcolumnindex = dataGridView1.CurrentRow.Cells.IndexOf(dataGridView1.CurrentCell); -
-
stringnewName "New"= + (k++); -
column.HeaderText =newName; -
//column.AutoSizeMode= DataGridViewAutoSizeColu mnMode.DisplayedCells;
-
//column.CellTemplate.Style.BackColor= Color.Beige;
-
dataGridView1.Columns.Insert(columnindex + 1, column); -
} -
catch(Exceptionerror) -
{ -
MessageBox.Show(error.Message); -
} -
}
6.其他的代码就不一一上传了,只把主要的问题和代码上传,有需要的邮件给我,我传给你。
第一次发这么长的,求人品。。。。。。。。
(附图,有图有真相,见下):http://my.csdn.net/uploads/201208/20/1345429668_7895.png

加载中…