关于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()