关于Excel操作编写的一个软件设计构思案例[连载] --保存条件设定的另一种方式:更新与插入方法
来源:互联网 发布:常见网络拓扑结构图 编辑:程序博客网 时间:2024/04/30 06:46
下面这个方法由于条件设定数据不慎丢失可以把以前已经提取的数据导入设定控件中,同时去重复和按降序排列,采用数据表方式,看代码:
private void 导入设定() { 条件设定.BeginInvoke(new Action(delegate() { int 量 = 条件设定.RowCount - 1, 数 = 处理结果.RowCount - 1, 动量 = 0; DataTable 绑定源 = (DataTable)条件设定.DataSource; //if (行 > 量) 条件设定.Rows.Add(); if (处理结果.CurrentCellAddress.Y >= 0) for (int 列 = 1; 列 < 9; 列++) { string[] 数据 = new string[量 + 数]; for (int 行 = 0; 行 < 数; 行++) { string 读数据 = 处理结果.Rows[行].Cells[列].Value.ToString(); if (读数据 != "/" && 读数据 != "") 数据[行] = 读数据; else 数据[行] = ""; } for (int 行 = 0; 行 < 量; 行++) { string 读数据 = 条件设定.Rows[行].Cells[列 - 1].Value.ToString(); if (读数据 != "/" && 读数据 != "") 数据[数 + 行] = 读数据; else 数据[数 + 行] = ""; } 数据 = 数据.OrderByDescending(排序 => 排序.Length).Distinct().ToArray(); if (绑定源.Rows.Count < 数据.Length) 动量 = 数据.Length; else 动量 = 绑定源.Rows.Count; for (int 行 = 0; 行 < 动量; 行++) { if (行 >= 绑定源.Rows.Count) 绑定源.Rows.Add(); if (行 < 数据.Length) 绑定源.Rows[行][列 - 1] = 数据[行]; else 绑定源.Rows[行][列 - 1] = ""; } } 条件设定.DataSource = 绑定源; 控件表标头设置(); })); }
条件设定(保存提取字符数据)分为正副本保存,副本随时动态保存,正本通过菜单保存,避免条件设定数据丢失采用方法,副本读取数据量不显示出来,正本显示出来,用于不断添加数据,看代码:
private void 读取设定(string 文件名, bool 加载条件) { DataSet 读取条件设定 = new DataSet(); 读取条件设定 = 读取微软表格文件(@System.Environment.CurrentDirectory + "\\" + 文件名); 读取.Join(); DataTable 条件设定表 = 读取条件设定.Tables[0].DefaultView.ToTable(true, 创建2); if (加载条件) 原条件设定数 = 读取条件设定.Tables[0].Rows.Count; if (!加载条件) 副条件设定数 = 读取条件设定.Tables[0].Rows.Count; if (加载条件) 条件设定.Invoke(new Action(delegate() { 条件设定.DataSource = 条件设定表; })); 条件设定.Columns[5].Width = 25; 条件设定.Columns[0].Width = 35; 条件设定.Columns[1].Width = 35; 控件表标头设置(); }下面是保存条件设定方法,采用数据表更新和插入方式,看代码:
private void 条件设定生成表(string 文件名, bool 条件) { DataTable 条件设定表 = new DataTable(); 条件设定表.TableName = "条件设定表"; foreach (string 数据列 in 创建2) 条件设定表.Columns.Add(数据列); 条件设定表.Columns.Add("序"); this.BeginInvoke(new Action(delegate() { for (int 行 = 0, 数 = 条件设定.RowCount - 1; 行 < 数; 行++) { 条件设定表.Rows.Add(); for (int 列 = 0, 量 = 条件设定.ColumnCount; 列 < 量; 列++) 条件设定表.Rows[行][列] = 条件设定.Rows[行].Cells[列].Value; 条件设定表.Rows[行][10] = "序" + (行 + 1).ToString(); } 更新 = new Thread(delegate() { 写入Excel文件(条件设定表, 条件, 文件名); }); 更新.Start(); })); }
需要说明的是Excel文件的第一行必须事先填写有对应的列信息:省 市 区、县 镇、乡 街、路、村 ☆ 自然村 村民组 门牌号 原字符☆替字符 序 才可以使用以下方法. private void 写入Excel文件(DataTable 数据表, bool 滚动, string 文件名) { 计数 = 0; try { string 微软表格 = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + System.Environment.CurrentDirectory + "\\" + 文件名 + "; Extended Properties = \"Excel 12.0 Xml; HDR = No\""; OleDbConnection 表格文件 = new OleDbConnection(微软表格); 表格文件.Open(); System.Data.OleDb.OleDbCommand 执行写入 = new OleDbCommand(); 执行写入.Connection = 表格文件; for (int 行 = 0, 数 = 数据表.Rows.Count; 行 < 数; 行++) { if (滚动) this.BeginInvoke(new Action(delegate() { 条件设定.CurrentCell = 条件设定.Rows[行].Cells[5]; })); int 条件设定数 = 0; if (滚动) 条件设定数 = 原条件设定数; else 条件设定数 = 副条件设定数; if (行 >= 条件设定数) { 执行写入.CommandText = "INSERT INTO [sheet1$] (省, 市, 区、县, 镇、乡, 街、路、村, ☆, 自然村, 村民组, 门牌号, 原字符☆替字符, 序) VALUES ('" + 数据表.Rows[行][0] + "','" + 数据表.Rows[行][1] + "','" + 数据表.Rows[行][2] + "','" + 数据表.Rows[行][3] + "','" + 数据表.Rows[行][4] + "','" + 数据表.Rows[行][5] + "','" + 数据表.Rows[行][6] + "','" + 数据表.Rows[行][7] + "','" + 数据表.Rows[行][8] + "','" + 数据表.Rows[行][9] + "','序" + (行 + 1).ToString() + "')"; 计数 = 执行写入.ExecuteNonQuery(); if (滚动) 原条件设定数++; else 副条件设定数++; } else { string 执行更新 = " UPDATE [sheet1$] SET 省 = '" + 条件设定.Rows[行].Cells[0].Value + "'" + " , 市 = '" + 数据表.Rows[行][1] + "' , 区、县 = '" + 数据表.Rows[行][2] + "'" + " , 镇、乡 = '" + 数据表.Rows[行][3] + "' , 街、路、村 = '" + 数据表.Rows[行][4] + "'" + " , ☆ = '" + 数据表.Rows[行][5] + "' , 自然村 = '" + 数据表.Rows[行][6] + "'" + " , 村民组 = '" + 数据表.Rows[行][7] + "' , 门牌号 = '" + 数据表.Rows[行][8] + "'" + " , 原字符☆替字符 = '" + 数据表.Rows[行][9] + "'" + " WHERE 序 = '序" + (行 + 1).ToString() + "'"; OleDbCommand 执行 = new OleDbCommand(执行更新, 表格文件); 计数 = 执行.ExecuteNonQuery(); } } 表格文件.Close(); 数据表.Clear(); if (滚动) MessageBox.Show("写入Excel成功!" + (条件设定.RowCount - 1).ToString() + "行数据。", "友情提示!"); } catch (System.Data.OleDb.OleDbException ex) { MessageBox.Show("写入Excel发生错误:" + ex.Message, "错误?"); } }有时提取出来的字符有略写的应补全,错别字的应纠正等情况,故此,设计一列用来存储这样替换的数据,并以☆作为分隔符,全列替换:2个编辑控件选中的列全部数据循环执行,定列替换:只按选定的一个单元格替换字符全列执行,定位替换:只替换选定的单元格,看代码:
private void 替换字符(string 条件) { 定位 = 处理结果.CurrentCellAddress.X; if (条件=="全列") for (int 替换字符行 = 0, 量 = 条件设定.RowCount - 1; 替换字符行 < 量; 替换字符行++) 字符替换(条件设定.Rows[替换字符行].Cells[9].Value.ToString()); if (条件 == "定列") 字符替换(条件设定.Rows[条件设定.CurrentCellAddress.Y].Cells[9].Value.ToString()); if (条件 == "定位") { string[] 字符组 = 条件设定.Rows[条件设定.CurrentCellAddress.Y].Cells[9].Value.ToString().Split('☆'); string 被替换字符 = 处理结果.Rows[处理结果.CurrentCellAddress.Y].Cells[定位].Value.ToString(); 处理结果.Rows[处理结果.CurrentCellAddress.Y].Cells[定位].Value = 被替换字符.Replace(字符组[0], 字符组[1]); } } private void 字符替换(string 替换字符) { for (int 行 = 0, 数 = 处理结果.RowCount; 行 < 数; 行++) { if (替换字符 == "") break; else { string[] 字符组 = 替换字符.Split('☆'); string 被替换字符 = 处理结果.Rows[行].Cells[定位].Value.ToString(); if (被替换字符.Contains(字符组[1]) && 字符组[1] != "") continue; 处理结果.Rows[行].Cells[定位].Value = 被替换字符.Replace(字符组[0], 字符组[1]); } } }
条件设定动态保存方法,看代码:
private void 条件设定_CellEndEdit(object sender, DataGridViewCellEventArgs e) { 条件设定.BeginInvoke(new Action(delegate() { int 量 = 条件设定.RowCount - 1; string[] 数据 = new string[量]; for (int 行 = 0; 行 < 量; 行++) { 数据[行] = 条件设定.Rows[行].Cells[条件设定.CurrentCellAddress.X].Value.ToString(); } 数据 = 数据.OrderByDescending(排序 => 排序.Length).Distinct().ToArray(); for (int 行 = 0; 行 < 量; 行++) { if (行 < 数据.Length) 条件设定.Rows[行].Cells[条件设定.CurrentCellAddress.X].Value = 数据[行]; else 条件设定.Rows[行].Cells[条件设定.CurrentCellAddress.X].Value = ""; } 条件设定生成表("条件设定副本.xls", false); })); }
替换列自动添加分隔符,看代码:
private void 条件设定_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { if (条件设定.CurrentCellAddress.X == 9) if (!条件设定.Rows[条件设定.CurrentCellAddress.Y].Cells[条件设定.CurrentCellAddress.X].Value.ToString().Contains("☆")) 条件设定.Rows[条件设定.CurrentCellAddress.Y].Cells[条件设定.CurrentCellAddress.X].Value = "☆"; }
尚余的下次发布。
VB:答复例子
Dim 文件路径 As String = System.Environment.CurrentDirectory + "\AAA.xls" Dim 字符 As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 文件路径 + ";Extended Properties='Excel 8.0;'" Dim 连接 As New System.Data.OleDb.OleDbConnection(字符) 连接.Open() Dim 操作 As New System.Data.OleDb.OleDbCommand() 操作.Connection = 连接 操作.CommandText = "Insert into [Sheet1$](a,b) values('aaaaaaaaaaaaa','bbbbbbbbbbbbbbb')" 操作.ExecuteNonQuery() Dim 读取数据 = "SELECT * FROM [Sheet1$]" Dim 读取 As New System.Data.OleDb.OleDbDataAdapter(读取数据, 连接) Dim 数据表 As New DataSet() 读取.Fill(数据表, "[Sheet1$]") 连接.Close()
- 关于Excel操作编写的一个软件设计构思案例[连载] --保存条件设定的另一种方式:更新与插入方法
- 关于Excel操作编写的一个软件设计构思案例[连载]
- 关于Excel操作编写的一个软件设计构思案例[连载] --辅助功能:补全缺少数据、树定位、文本读与保存
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何创建快捷菜单执行人机交互操作、软件初始化设置
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何打开Excel文件,获取需要列的数据显示到表格内做修改
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何把处理好后的数据导出Excel文件中(含背景\字体颜色设置)
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何实现从字符串中提取需要的字符并赋值给指定单元格内
- C++中 关于 Excel 展示与保存的方法问题
- 保存用户名密码的另一种方式 CREDENTIALW
- [构思]设计&实现一个执行Excel的Import&Export操作的类
- 调用方法的另一种方式
- 调用方法的另一种方式
- 对3D实体化的另一种构思
- 平方探测的另一种插入方式
- MapReduce--WordCount的另一种编写方式
- Silverlight导出excel的另一种方式
- 另一种处理Excel的方法NPOI
- 编写cgi的一个条件
- hibernate二级缓存配置文件ehcache.xml属性意义
- 迷宫。。。
- windows 下vim taglist插件的安装,真实可用
- 库
- try to use recycled bitmap
- 关于Excel操作编写的一个软件设计构思案例[连载] --保存条件设定的另一种方式:更新与插入方法
- JNI 的 local reference table overflowed 问题
- Nginx的epoll模块
- android 滚动条 相关属性
- Rcp应用在启动时出现找不到org.eclipse.equinox.launcher.Main类错误
- 不安装oracle、3分钟直接用pl/sql连接oracle server
- vlc源代码分析详解
- 如何用matlab启动.exe文件?
- php定时计划任务实现方法