using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Columns; using System.Data.Common; using System.Data.SqlClient; using Lskj; using CommonLib; using Lskj.MyControl; using DevExpress.XtraEditors.Repository; using DevExpress.XtraEditors; namespace ExcelPlus { public partial class frmImport : DevExpress.XtraEditors.XtraForm { public frmImport() { DevExpress.Skins.SkinManager.EnableFormSkins(); InitializeComponent(); } private GridControlEx importGrid; private string importTable = ""; private string OperatorId = "1"; private string OperatorName = "管理员"; private string mainKeyField = ""; private string mainKeyValue = ""; private string columnPrefix = ""; private string leftField, leftValue; private int success = 0, failed = 0; private Dictionary lookupTables; public frmImport(GridControlEx grid, string table,string mainKey,string mainValue, string inoperatorid, string inoperatorname,string colPrefix) { DevExpress.Skins.SkinManager.EnableFormSkins(); InitializeComponent(); importGrid = grid; importTable = table; lookupTables = grid.lookupTables; OperatorId = inoperatorid; OperatorName = inoperatorname; mainKeyField = mainKey; mainKeyValue = mainValue; columnPrefix = colPrefix; //初始化grid grdImp.gridView.Columns.Clear(); GridView grv = (GridView)grid.gridView; foreach (GridColumn gc in grv.VisibleColumns) { GridColumn gctmp = grdImp.gridView.Columns.Add(); gctmp.Tag = gc.Tag; gctmp.FieldName = gc.FieldName; gctmp.Width = gc.Width; gctmp.Caption = gc.Caption; gctmp.Visible = true; } } public frmImport(GridControlEx grid, GridControlEx gridMain, string MainModId, string ModId, string table, string inoperatorid, string inoperatorname) { DevExpress.Skins.SkinManager.EnableFormSkins(); InitializeComponent(); importGrid = grid; importTable = table; OperatorId = inoperatorid; OperatorName = inoperatorname; lookupTables = grid.lookupTables; //初始化grid grdImp.gridView.Columns.Clear(); GridView grv = (GridView)grid.gridView; foreach (GridColumn gc in grv.VisibleColumns) { GridColumn gctmp = grdImp.gridView.Columns.Add(); gctmp.Tag = gc.Tag; gctmp.FieldName = gc.FieldName; gctmp.Width = gc.Width; gctmp.Caption = gc.Caption; gctmp.Visible = true; } } public frmImport(GridControlEx grid, string table, string mainKey, string mainValue, string inoperatorid, string inoperatorname, string colPrefix, string leftField, string leftValue) { DevExpress.Skins.SkinManager.EnableFormSkins(); InitializeComponent(); importGrid = grid; importTable = table; lookupTables = grid.lookupTables; OperatorId = inoperatorid; OperatorName = inoperatorname; mainKeyField = mainKey; mainKeyValue = mainValue; columnPrefix = colPrefix; this.leftField = leftField; this.leftValue = leftValue; //初始化grid grdImp.gridView.Columns.Clear(); GridView grv = (GridView)grid.gridView; foreach (GridColumn gc in grv.VisibleColumns) { GridColumn gctmp = grdImp.gridView.Columns.Add(); gctmp.Tag = gc.Tag; gctmp.FieldName = gc.FieldName; gctmp.Width = gc.Width; gctmp.Caption = gc.Caption; gctmp.Visible = true; } } private void button1_Click(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { } private void simpleButton1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "导入文件选择"; ofd.Filter = "Excel文件(*.xls)|*.xls|(*.xlsx)|*.xlsx"; DialogResult dialogResult = ofd.ShowDialog(); if (dialogResult == DialogResult.OK) { string file = ofd.FileName; DataTable dt = ExcelHelper.ImportToGrid(file, importTable, false, grdImp.gridControl); grdImp.gridControl.DataSource = dt; } } private void simpleButton2_Click(object sender, EventArgs e) { importFromGridBySql(); } private void importFromGrid() { DataTable dt = (DataTable)grdImp.gridControl.DataSource; if (dt == null) { MessageBox.Show("请先读取Excel文件数据", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (dt.Rows.Count < 1) { MessageBox.Show("没有任何数据可以进行导入", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //提交到数据库 try { string sql = "select * from " + importTable + " where 1<>1"; SqlDataAdapter dat = SqlHelper.ExecuteAdapter(CommandType.Text, sql); SqlCommandBuilder scb = new SqlCommandBuilder(dat); DataTable datatb = new DataTable(); dat.Fill(datatb); //根据全表字段类型进行默认填充 int currRow = 0; foreach (DataRow dr in dt.Rows) { DataRow tmpRow = datatb.NewRow(); foreach (DataColumn dc in datatb.Columns) { if (dc.DataType.Name.ToLower() == "string") tmpRow[dc] = ""; if (dc.DataType.Name.ToLower().IndexOf("char") >= 0) tmpRow[dc] = ""; if (dc.DataType.Name.ToLower().IndexOf("int") >= 0) tmpRow[dc] = 0; if (dc.DataType.Name.ToLower() == "decimal") tmpRow[dc] = 0; //if (dc.DataType.Name.ToLower().IndexOf("date") >= 0) // tmpRow[dc] = DateTime.Now; } foreach (GridColumn gc in grdImp.gridView.VisibleColumns) { int fieldType = (gc.Tag as MyTagModel).fieldTypeId; string lookupKey = (gc.Tag as MyTagModel).lookupKey; string lookupValue = (gc.Tag as MyTagModel).lookupValue; if ((fieldType == 1) || (fieldType == 5) || (fieldType == 15)) { DataTable tmpdt = lookupTables[gc.FieldName]; DataRow[] tmpdr = tmpdt.Select(lookupValue + "='" + dr[gc.FieldName] + "'"); if ((tmpdr != null) && (tmpdr.Length < 1)) { MessageBox.Show("数据导入错误,未找到对应的编码,请检查!\r\n第" + (currRow + 1).ToString() + "行,第" + (gc.VisibleIndex + 1).ToString() + "列", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } tmpRow[gc.FieldName] = tmpdr[0][lookupKey]; } //排除数值型导入空值的可能 else if (dr[gc.FieldName].ToString().Trim() != "") { if (dr[gc.FieldName].ToString().Trim() == "校验") tmpRow[gc.FieldName] = "1"; else if (dr[gc.FieldName].ToString().Trim() == "非校验") tmpRow[gc.FieldName] = "0"; else tmpRow[gc.FieldName] = dr[gc.FieldName]; } } if (datatb.Columns.Contains(columnPrefix + "operatorid")) tmpRow[columnPrefix + "operatorid"] = OperatorId; if (datatb.Columns.Contains(columnPrefix + "operatorname")) tmpRow[columnPrefix + "operatorname"] = OperatorName; if (datatb.Columns.Contains(columnPrefix + "operatedate")) tmpRow[columnPrefix + "operatedate"] = DateTime.Now; if (datatb.Columns.Contains(columnPrefix + leftField)) tmpRow[columnPrefix + leftField] = leftValue; if (mainKeyField != "") tmpRow[mainKeyField] = mainKeyValue; datatb.Rows.Add(tmpRow); currRow++; } dat.Update(datatb); datatb.AcceptChanges(); dt.AcceptChanges(); MessageBox.Show("数据导入成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); datatb.Clear(); dt.Clear(); } catch (Exception ex) { MessageBox.Show("数据提交错误:\n" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void importFromGridBySql() { success = failed = 0; DataTable dt = (DataTable)grdImp.gridControl.DataSource; if (dt == null) { MessageBox.Show("请先读取Excel文件数据", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (dt.Rows.Count < 1) { MessageBox.Show("没有任何数据可以进行导入", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //提交到数据库 try { string sql = "select * from " + importTable + " where 1<>1"; SqlDataAdapter dat = SqlHelper.ExecuteAdapter(CommandType.Text, sql); SqlCommandBuilder scb = new SqlCommandBuilder(dat); DataTable datatb = new DataTable(); DataTable failedData = new DataTable(); dat.Fill(datatb); failedData = dt.Clone(); //根据全表字段类型进行默认填充 int currRow = 0; foreach (DataRow dr in dt.Rows) { DataRow tmpRow = datatb.NewRow(); foreach (DataColumn dc in datatb.Columns) { if (dc.DataType.Name.ToLower() == "string") tmpRow[dc] = ""; if (dc.DataType.Name.ToLower().IndexOf("char") >= 0) tmpRow[dc] = ""; if (dc.DataType.Name.ToLower().IndexOf("int") >= 0) tmpRow[dc] = 0; if (dc.DataType.Name.ToLower() == "decimal") tmpRow[dc] = 0; //if (dc.DataType.Name.ToLower().IndexOf("date") >= 0) // tmpRow[dc] = DateTime.Now; } foreach (GridColumn gc in grdImp.gridView.VisibleColumns) { if (datatb.Columns.Contains(gc.FieldName)) { int fieldType = (gc.Tag as MyTagModel).fieldTypeId; string lookupKey = (gc.Tag as MyTagModel).lookupKey; string lookupValue = (gc.Tag as MyTagModel).lookupValue; bool isEmpty = (gc.Tag as MyTagModel).IsEmpt; if ((fieldType == 1) || (fieldType == 5) || (fieldType == 15)||(fieldType==3)) { DataTable tmpdt = lookupTables[gc.FieldName]; DataRow[] tmpdr = tmpdt.Select(lookupValue + "='" + dr[gc.FieldName] + "'"); if ((tmpdr != null) && (tmpdr.Length < 1)) { if (isEmpty) { MessageBox.Show("数据导入错误,未找到对应的编码,请检查!\r\n第" + (currRow + 1).ToString() + "行,第" + (gc.VisibleIndex + 1).ToString() + "列-" + gc.Caption, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else { GridColumn column = importGrid.gridView.Columns[gc.FieldName]; if (column.ColumnType.Name.ToLower().IndexOf("int") >= 0) if (column.ColumnType.Name.ToLower() == "string") tmpRow[gc.FieldName] = ""; if (column.ColumnType.Name.ToLower().IndexOf("char") >= 0) tmpRow[gc.FieldName] = ""; if (column.ColumnType.Name.ToLower().IndexOf("int") >= 0) tmpRow[gc.FieldName] = 0; if (column.ColumnType.Name.ToLower() == "decimal") tmpRow[gc.FieldName] = 0; } } else { tmpRow[gc.FieldName] = tmpdr[0][lookupKey]; } } //排除数值型导入空值的可能 else if (dr[gc.FieldName].ToString().Trim() != "") { GridColumn column = importGrid.gridView.Columns[gc.FieldName]; if (dr[gc.FieldName].ToString().Trim() == "校验") tmpRow[gc.FieldName] = "1"; else if (dr[gc.FieldName].ToString().Trim() == "非校验") tmpRow[gc.FieldName] = "0"; string fieldValue= dr[gc.FieldName].ToString().Trim(); if (fieldValue == "是" || fieldValue == "否") { if (column.ColumnEdit != null && column.ColumnEdit.GetType() == typeof(RepositoryItemCheckEdit)) { tmpRow[gc.FieldName] = "1"; } else if (column.ColumnType != null && column.ColumnType.Name.ToLower() == "boolean") { tmpRow[gc.FieldName] = true; } else { tmpRow[gc.FieldName] = fieldValue; } } else tmpRow[gc.FieldName] = fieldValue; } } } //if (datatb.Columns.Contains(columnPrefix + "operatorid")) // tmpRow[columnPrefix + "operatorid"] = OperatorId; //if (datatb.Columns.Contains(columnPrefix + "operatorname")) // tmpRow[columnPrefix + "operatorname"] = OperatorName; //if (datatb.Columns.Contains(columnPrefix + "operatedate")) // tmpRow[columnPrefix + "operatedate"] = DateTime.Now; setDefaultValue(datatb, tmpRow); if (mainKeyField != "") tmpRow[mainKeyField] = mainKeyValue; if (datatb.Columns.Contains(columnPrefix + leftField)) { if (tmpRow[columnPrefix + leftField]+""=="") tmpRow[columnPrefix + leftField] = leftValue; } datatb.Rows.Add(tmpRow); try { dat.Update(datatb); datatb.AcceptChanges(); success++; } catch (Exception ex) { dr.RowError = ex.Message; failedData.ImportRow(dr); datatb.Rows.Remove(tmpRow); failed++; } currRow++; } //dat.Update(datatb); //datatb.AcceptChanges(); dt.AcceptChanges(); XtraMessageBox.Show("数据导入完成,成功"+success.ToString()+"条,失败"+failed.ToString()+"条", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); datatb.Clear(); dt.Clear(); if (failed>0) grdImp.gridControl.DataSource = failedData; } catch (Exception ex) { string mesage = ex.Message; foreach (GridColumn gc in grdImp.gridView.VisibleColumns) { if (ex.Message.Contains(gc.FieldName)) { mesage = gc.Caption + " 格式不正确,请检查!"; break; } } MessageBox.Show("数据提交错误:\n" + mesage, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void simpleButton3_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; } private void btnExprotTemp_Click(object sender, EventArgs e) { ExcelHelper.SaveXls(grdImp.gridControl); } private void grdvImp_KeyDown(object sender, KeyEventArgs e) { GridView gridView = grdImp.gridView; if (sender != null && e != null) { if ((e.KeyCode == Keys.F6) || (e.KeyCode == Keys.F7)) { GridColumn gc = gridView.FocusedColumn; if ((gc != null) && (gridView.RowCount > 0) && (gc.OptionsColumn.AllowEdit == true) && (gridView.OptionsBehavior.Editable == true)) { DevExpress.XtraGrid.Views.Base.GridCell[] selecells = gridView.GetSelectedCells(); if (selecells.Length == 1) { if (gridView.FocusedRowHandle < gridView.RowCount) { DialogResult dlr = MessageBox.Show("是否替换本列下所有数据为当前单元格数据?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dlr == DialogResult.Yes) { object obj = gridView.GetFocusedRowCellValue(gc); if (obj != null) { for (int i = gridView.FocusedRowHandle; i <= gridView.RowCount; i++) { object obj1 = gridView.GetRowCellValue(i, gc); if (e.KeyCode == Keys.F6) { if ((obj1 == null) || (obj1.ToString() == "0") || (obj1.ToString() == "")) gridView.SetRowCellValue(i, gc, obj); } else gridView.SetRowCellValue(i, gc, obj); } e.Handled = true; } } } } else { e.Handled = true; } } } if ((e.KeyCode == Keys.F8)) { GridColumn gc = gridView.FocusedColumn; if ((gc != null) && (gridView.RowCount > 0) && (gc.OptionsColumn.AllowEdit == true) && (gridView.OptionsBehavior.Editable == true)) { DevExpress.XtraGrid.Views.Base.GridCell[] selecells = gridView.GetSelectedCells(); if (selecells.Length == 1) { if (gridView.FocusedRowHandle < gridView.RowCount) { DialogResult dlr = MessageBox.Show("是否按顺序生成本列数据?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dlr == DialogResult.Yes) { object obj = gridView.GetFocusedRowCellValue(gc); int lint = 0; int ilen = 0; if ((obj != null) && (Int32.TryParse(obj + "", out lint))) { ilen = obj.ToString().Length; for (int i = gridView.FocusedRowHandle; i <= gridView.RowCount; i++) { string istr = lint.ToString().PadLeft(ilen, '0'); gridView.SetRowCellValue(i, gc, istr); lint++; } e.Handled = true; } } } } else { e.Handled = true; } } } } } private void frmImport_FormClosing(object sender, FormClosingEventArgs e) { this.DialogResult = success > 0 ? DialogResult.OK : DialogResult.No; } /// /// 查找当前是否存在指定值 /// /// /// /// private void setDefaultValue(DataTable dtTable, DataRow currentRow) { if ((dtTable.Columns.Contains(columnPrefix + "operatorid")) && ((string.IsNullOrEmpty(currentRow[columnPrefix + "operatorid"] + "") || currentRow[columnPrefix + "operatorid"] + "" == "0"))) currentRow[columnPrefix + "operatorid"] = OperatorId; if ((dtTable.Columns.Contains(columnPrefix + "operatorname")) && ((string.IsNullOrEmpty(currentRow[columnPrefix + "operatorname"] + "") || currentRow[columnPrefix + "operatorname"] + "" == "0"))) currentRow[columnPrefix + "operatorname"] = OperatorName; if ((dtTable.Columns.Contains(columnPrefix + "operatedate")) && ((string.IsNullOrEmpty(currentRow[columnPrefix + "operatedate"] + "") || currentRow[columnPrefix + "operatedate"] + "" == "0"))) currentRow[columnPrefix + "operatedate"] = DateTime.Now; /* foreach (DataColumn col in dtTable.Columns) { if (string.IsNullOrEmpty(currentRow[col.ColumnName] + "") || currentRow[col.ColumnName] + "" == "0") { if (col.ColumnName.Contains(columnPrefix + "operatorid")) currentRow[col.ColumnName] = OperatorId; if (col.ColumnName.Contains(columnPrefix+"operatorname")) currentRow[col.ColumnName] = OperatorName; if (col.ColumnName.Contains(columnPrefix+"operatedate")) currentRow[col.ColumnName] = DateTime.Now; } } */ } } }