`
thecloud
  • 浏览: 880294 次
文章分类
社区版块
存档分类
最新评论

基于ArcGIS10.0和Oracle10g的空间数据管理平台五(C#开发)-通用工具类

 
阅读更多

由于在介绍通用数据管理模块功能的时候用到了许多通用的功能,例如word和excel与DataGridView控件的相互导入导出、写日志到数据库中等等。为了后面每一篇文章都能清楚的知道每一个功能具体是怎么实现的,现在先统一把用到的所有公用功能统一介绍和实现。由于SqlHelper类,也就是数据库的一些通用操作已经在登录模块中介绍,就不在重复介绍了。本篇将相介绍通用工具类CommonTools,由于代码中有比较详细的注释了,就不详细解析具体代码的功能了。这个类实现的功能如下。

1.从DataGridView控件导出数据到Word文档

        /// <summary>
        /// 从DataGridView控件导出数据到word文档
        /// </summary>
        /// <param name="dgv"></param>
        public static void ExportDataGridViewToWord(DataGridView dgv)
        {
            //打开保存的文件名
            SaveFileDialog sfile = new SaveFileDialog();
            sfile.AddExtension = true;
            sfile.DefaultExt = ".doc";
            sfile.Filter = "(*.doc)|*.doc";
            if (sfile.ShowDialog() == DialogResult.OK)
            {
                object path = sfile.FileName;
                Object none = System.Reflection.Missing.Value;
                Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
                Microsoft.Office.Interop.Word.Document document = wordApp.Documents.Add(ref none, ref none, ref none, ref none);
                //建立表格
                Microsoft.Office.Interop.Word.Table table = document.Tables.Add(document.Paragraphs.Last.Range, dgv.Rows.Count, dgv.Columns.Count, ref none, ref none);
                try
                {
                    //设置标题
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        table.Cell(0, i + 1).Range.Text = dgv.Columns[i].HeaderText;
                    }
                    //填充数据
                    for (int i = 1; i < dgv.Rows.Count; i++)
                    {
                        for (int j = 0; j < dgv.Columns.Count; j++)
                        {
                            table.Cell(i + 1, j + 1).Range.Text = dgv[j, i - 1].Value.ToString();
                        }
                    }
                    document.SaveAs(ref path, ref none, ref none, ref none, ref none, ref none,
                        ref none, ref none, ref none, ref none, ref none, ref none, ref none, 
                        ref none, ref none, ref none);
                    document.Close(ref none, ref none, ref none);
                    MessageBox.Show("导出成功!");
                }
                finally
                {
                    wordApp.Quit(ref none, ref none, ref none);
                }
            }
        }

2.导出DataGridView中的数据到excel,实现代码如下:

        /// <summary>
        /// 导出DataGridView中的数据到excel
        /// </summary>
        /// <param name="dataGridview1">DataGridView控件</param>
        public static void ExportDataGridViewToExcel(DataGridView dataGridview1)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
            saveFileDialog.FilterIndex = 0;
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.CreatePrompt = true;
            saveFileDialog.Title = "导出Excel文件到";

            saveFileDialog.ShowDialog();

            Stream myStream;
            myStream = saveFileDialog.OpenFile();
            StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));
            string str = "";
            try
            {
                //写标题  
                for (int i = 0; i < dataGridview1.ColumnCount; i++)
                {
                    if (i > 0)
                    {
                        str += "\t";
                    }
                    str += dataGridview1.Columns[i].HeaderText;
                }

                sw.WriteLine(str);
                //写内容 
                for (int j = 0; j < dataGridview1.Rows.Count; j++)
                {
                    string tempStr = "";
                    for (int k = 0; k < dataGridview1.Columns.Count; k++)
                    {
                        if (k > 0)
                        {
                            tempStr += "\t";
                        }
                        tempStr += dataGridview1.Rows[j].Cells[k].Value.ToString();
                    }
                    sw.WriteLine(tempStr);
                }
                sw.Close();
                myStream.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                sw.Close();
                myStream.Close();
            }
        }

3.导入XML文件的数据到Oracle数据库

        /// <summary>
        /// 导入XML文件的数据到Oracle数据库中
        /// </summary>
        /// <param name="strXmlFileName">Xml文件名称(完整的路径)</param>
        /// <param name="strDatabaseName">导入的数据库名称</param>
        public static void ImportXmlToOracle(string strXmlFileName, string strDatabaseName)
        {
            NewDataSet nds = new NewDataSet();
            string sql = string.Empty;

            foreach (System.Data.DataTable dt in nds.Tables)
            {
                sql = "select * from ";
                sql += strDatabaseName + "_" + dt.TableName;

                OracleDataAdapter oda = new OracleDataAdapter(sql,
                                ConfigurationSettings.AppSettings["ConnectionString"]);
            
                OracleCommandBuilder builder = new OracleCommandBuilder(oda);
                oda.Fill(nds.Tables[dt.TableName]);
            }

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(strXmlFileName);
                XmlNodeList nodeList = doc.GetElementsByTagName("tableType");
                string strTableType = string.Empty;
                foreach (XmlNode node in nodeList)
                {
                    if (node.Name == "tableType")
                    {
                        strTableType += node.InnerText + ";";
                    }
                }

                strTableType = strTableType.Substring(0, strTableType.Length - 1);
                foreach (XmlNode node in nodeList)
                {
                    if (node.Name == "tableType")
                    {
                        node.InnerText = strTableType;
                        break;
                    }
                }

                nodeList = doc.GetElementsByTagName("graphOverview");
                foreach (XmlNode node in nodeList)
                {
                    if (node.Name == "graphOverview")
                    {
                        string str = string.Empty;
                        if (node.InnerText.IndexOf(".jpg".ToUpper()) != -1)
                        {
                            str = node.InnerText.Substring(node.InnerText.IndexOf(".jpg".ToUpper()) + 4);
                        }
                        else if (node.InnerText.IndexOf(".jpg") != -1)
                        {
                            str = node.InnerText.Substring(node.InnerText.IndexOf(".jpg") + 4);
                        }
                        node.InnerText = str;
                        
                        break;
                    }
                }
                
                doc.Save("temp.xml");
                nds.ReadXml("temp.xml");
                System.IO.File.Delete("temp.xml");

                foreach (System.Data.DataTable dt in nds.Tables)
                {
                    if (dt.Rows.Count > 0)
                    {
                         string strTableName = strDatabaseName + "_" + dt.TableName;
                         sql = "select * from " + strTableName;
                         DataSet ds = new DataSet();

                         OracleDataAdapter oda = new OracleDataAdapter(sql,
                             ConfigurationSettings.AppSettings["ConnectionString"]);
                         OracleCommandBuilder builder = new OracleCommandBuilder(oda);
                         oda.Fill(ds);
                         oda.Update(dt);
                     }
                 }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                LogHelp.writeLog(FrmMain.metaUsername, "元数据目录管理",
                    "导入元数据文件<" + strXmlFileName + ">失败!");
            }
        }

这个函数主要用在元数据管理子系统,把XML格式的数据导入Oracle数据库,这里XML格式的文件是通过一个XSD文件定义格式得到的,XSD文件就是Xml数据格式的约束文件,就是通过它定义XML具体的格式。然而微软有一个工具可以根据这个XSD文件生成对应的数据集类,在我的代码里就是NewDataSet类。这个数据集类就可以管理对应的格式的所有XML生成的表结构数据。这里还需要说明一点的就是管理元数据需要一个单独的元数据库,也就是要求重新建立一个Oracle数据库,但是用C#代码创建Oracle数据库确实很有难度,所以我选择了一种比较巧妙的实现方式,就是把所有属于元数据的表用前缀标明(如metadata_名称),这样每次操作元数据库就只需要找到相应前缀的表就可以了,具体在元数据管理子系统有详细介绍实现方案。

因为XML文件里面包含有图片数据(经过64base编码的字符串表示),所以在处理XML文件需要先处理一下这个XML文件的图片字段,才有上面新建一个临时的XML文件,然后用数据集类对象读入XML数据,然后删除临时的XML文件。最后还是例如数据集适配器来插入元数据到Oracle数据库。

4.根据元数据的ID删除一条元数据(从Oracle数据库):

        /// <summary>
        /// 根据元数据ID删除一条元数据,一条元数据涉及到每一个元数据库的表
        /// </summary>
        /// <param name="strMdid">元数据ID</param>
        /// <param name="strDatabaseName">元数据名称</param>
        public static void DelOneMetaData(string strMdid, string strDatabaseName)
        {
            SqlHelper sh = new SqlHelper();
            OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
            conn.Open();
            //创建一个 OracleTransaction 对象,然后调用 OracleConnection 对象
            //的 BeginTransaction() 方法启动事务。
            OracleTransaction trans = conn.BeginTransaction();
            //创建一个 OracleCommand 对象,用于存储 SQL 语句。

            OracleCommand cmd = conn.CreateCommand();
            cmd.Transaction = trans;
            string sql = string.Empty;
            //xxx_metadata
            sql = "delete from " + strDatabaseName + "_metadata";
            sql += " where mdid like'" + strMdid + "'";
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();

            sql = "select metadata_id from " + strDatabaseName + "_metadata";
            sql += " where mdid like'" + strMdid + "'";
            OracleDataReader odr1 = sh.ReturnDataReader(sql);
            if (odr1.Read())
            {
                //xxx_continfo
                sql = "delete from " + strDatabaseName + "_continfo";
                sql += " where metadata_id=" + odr1[0].ToString();
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();

                sql = "select continfo_id from " + strDatabaseName + "_continfo";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataReader odr2 = sh.ReturnDataReader(sql);
                if (odr2.Read())
                {
                    //xxx_layerinfo
                    sql = "delete from " + strDatabaseName + "_layerinfo";
                    sql += " where continfo_id=" + odr2[0].ToString();
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();
                    //xxx_tableinfo
                    sql = "delete from " + strDatabaseName + "_tableinfo";
                    sql += " where continfo_id=" + odr2[0].ToString();
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();
                }
                //xxx_graph
                sql = "delete from " + strDatabaseName + "_graph";
                sql += " where metadata_id=" + odr1[0].ToString();
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();
                //xxx_idpoc
                sql = "delete from " + strDatabaseName + "_idpoc";
                sql += " where metadata_id=" + odr1[0].ToString();
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();

                sql = "select idpoc_id from " + strDatabaseName + "_idpoc";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataReader odr3 = sh.ReturnDataReader(sql);
                if (odr3.Read())
                {
                    //xxx_contact
                    sql = "delete from " + strDatabaseName + "_contact";
                    sql += " where idpoc_id=" + odr3[0].ToString();
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();

                    sql = "select contact_id from " + strDatabaseName + "_contact";
                    sql += " where idpoc_id=" + odr3[0].ToString();
                    OracleDataReader odr4 = sh.ReturnDataReader(sql);
                    if (odr4.Read())
                    {
                        //xxx_cntadd
                        sql = "delete from " + strDatabaseName + "_cntadd";
                        sql += " where contact_id=" + odr4[0].ToString();
                        cmd.CommandText = sql;
                        cmd.ExecuteNonQuery();

                        //xxx_cntphone
                        sql = "delete from " + strDatabaseName + "_cntphone";
                        sql += " where contact_id=" + odr4[0].ToString();
                        cmd.CommandText = sql;
                        cmd.ExecuteNonQuery();

                        sql = "select cntphone_id from " + strDatabaseName + "_cntphone";
                        sql += " where contact_id=" + odr4[0].ToString();
                        OracleDataReader odr5 = sh.ReturnDataReader(sql);
                        if (odr5.Read())
                        {
                            //xxx_voicenum
                            sql = "delete from " + strDatabaseName + "_voicenum";
                            sql += " where cntphone_id=" + odr4[0].ToString();
                            cmd.CommandText = sql;
                            cmd.ExecuteNonQuery();
                        }

                    }
                }
                //xxx_keyword
                sql = "delete from " + strDatabaseName + "_keyword";
                sql += " where metadata_id=" + odr1[0].ToString();
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();
                //xxx_onlinesrc
                sql = "delete from " + strDatabaseName + "_onlinesrc";
                sql += " where metadata_id=" + odr1[0].ToString();
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();

                sql = "select onlinesrc_id from " + strDatabaseName + "_onlinesrc";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataReader odr6 = sh.ReturnDataReader(sql);
                if (odr6.Read())
                {
                    //xxx_dtbrlinkage
                    sql = "delete from " + strDatabaseName + "_dtbrlinkage";
                    sql += " where onlinesrc_id=" + odr6[0].ToString();
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();

                    //xxx_dtdllinkage
                    sql = "delete from " + strDatabaseName + "_dtdllinkage";
                    sql += " where onlinesrc_id=" + odr6[0].ToString();
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();
                }
                //xxx_tpcat
                sql = "delete from " + strDatabaseName + "_tpcat";
                sql += " where metadata_id=" + odr1[0].ToString();
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();
                try
                {
                    trans.Commit();
                }
                catch (Exception)
                { 
                    trans.Rollback();
                    LogHelp.writeLog(FrmMain.metaUsername, "元数据编辑", "删除元数据<" + strMdid + ">失败!");
                    MessageBox.Show("删除元数据<" + strMdid + ">失败!");
                }
                finally
                {
                    conn.Close();
                }
            }
        }

因为根据XSD文件解析生成的数据库表有十几个,所以对每一个表单独采用事务操作,就是这十几个表其实是一个整体,可以完整的表示一条元数据(元数据:描述数据的数据,这里就是描述空间数据特性的数据)。

5.根据元数据的ID从Oracle查询得到一条元数据,和删除一条元数据类似,也需要十几个表一起操作:

       /// <summary>
        /// 根据元数据ID得到有一条元数据的数据集
        /// </summary>
        /// <param name="strMdid">元数据ID</param>
        /// <param name="strDatabaseName">元数据名称</param>
        /// <returns></returns>
        public static NewDataSet GetOneMetaData(string strMdid, string strDatabaseName)
        {
            NewDataSet nds = new NewDataSet();
            SqlHelper sh = new SqlHelper();

            string sql = string.Empty;
            //xxx_metadata
            sql = "select * from " + strDatabaseName + "_metadata";
            sql += " where mdid like'" + strMdid + "'";
            OracleDataAdapter oda1 = new OracleDataAdapter(sql,
                ConfigurationSettings.AppSettings["ConnectionString"]);
            oda1.Fill(nds.Tables["metadata"]);

            sql = "select metadata_id from " + strDatabaseName + "_metadata";
            sql += " where mdid like'" + strMdid + "'";
            OracleDataReader odr1 = sh.ReturnDataReader(sql);
            if (odr1.Read())
            {
                //xxx_continfo
                sql = "select * from " + strDatabaseName + "_continfo";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataAdapter oda2 = new OracleDataAdapter(sql,
                    ConfigurationSettings.AppSettings["ConnectionString"]);
                oda2.Fill(nds.Tables["continfo"]);

                sql = "select continfo_id from " + strDatabaseName + "_continfo";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataReader odr2 = sh.ReturnDataReader(sql);
                if (odr2.Read())
                {
                    //xxx_layerinfo
                    sql = "select * from " + strDatabaseName + "_layerinfo";
                    sql += " where continfo_id=" + odr2[0].ToString();
                    OracleDataAdapter oda8 = new OracleDataAdapter(sql,
                        ConfigurationSettings.AppSettings["ConnectionString"]);
                    oda8.Fill(nds.Tables["layerinfo"]);
                    //xxx_tableinfo
                    sql = "select * from " + strDatabaseName + "_tableinfo";
                    sql += " where continfo_id=" + odr2[0].ToString();
                    OracleDataAdapter oda9 = new OracleDataAdapter(sql,
                        ConfigurationSettings.AppSettings["ConnectionString"]);
                    oda9.Fill(nds.Tables["tableinfo"]);
                }
                //xxx_graph
                sql = "select * from " + strDatabaseName + "_graph";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataAdapter oda3 = new OracleDataAdapter(sql,
                    ConfigurationSettings.AppSettings["ConnectionString"]);
                oda3.Fill(nds.Tables["graph"]);
                //xxx_idpoc
                sql = "select * from " + strDatabaseName + "_idpoc";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataAdapter oda4 = new OracleDataAdapter(sql,
                    ConfigurationSettings.AppSettings["ConnectionString"]);
                oda4.Fill(nds.Tables["idpoc"]);

                sql = "select idpoc_id from " + strDatabaseName + "_idpoc";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataReader odr3 = sh.ReturnDataReader(sql);
                if (odr3.Read())
                {
                    //xxx_contact
                    sql = "select * from " + strDatabaseName + "_contact";
                    sql += " where idpoc_id=" + odr3[0].ToString();
                    OracleDataAdapter oda12 = new OracleDataAdapter(sql,
                        ConfigurationSettings.AppSettings["ConnectionString"]);
                    oda12.Fill(nds.Tables["contact"]);

                    sql = "select contact_id from " + strDatabaseName + "_contact";
                    sql += " where idpoc_id=" + odr3[0].ToString();
                    OracleDataReader odr4 = sh.ReturnDataReader(sql);
                    if (odr4.Read())
                    {
                        //xxx_cntadd
                        sql = "select * from " + strDatabaseName + "_cntadd";
                        sql += " where contact_id=" + odr4[0].ToString();
                        OracleDataAdapter oda13 = new OracleDataAdapter(sql,
                            ConfigurationSettings.AppSettings["ConnectionString"]);
                        oda13.Fill(nds.Tables["cntadd"]);

                        //xxx_cntphone
                        sql = "select * from " + strDatabaseName + "_cntphone";
                        sql += " where contact_id=" + odr4[0].ToString();
                        OracleDataAdapter oda14 = new OracleDataAdapter(sql,
                            ConfigurationSettings.AppSettings["ConnectionString"]);
                        oda14.Fill(nds.Tables["cntphone"]);

                        sql = "select cntphone_id from " + strDatabaseName + "_cntphone";
                        sql += " where contact_id=" + odr4[0].ToString();
                        OracleDataReader odr5 = sh.ReturnDataReader(sql);
                        if (odr5.Read())
                        {
                            //xxx_voicenum
                            sql = "select * from " + strDatabaseName + "_voicenum";
                            sql += " where cntphone_id=" + odr4[0].ToString();
                            OracleDataAdapter oda15 = new OracleDataAdapter(sql,
                                ConfigurationSettings.AppSettings["ConnectionString"]);
                            oda15.Fill(nds.Tables["voicenum"]);
                        }

                    }
                }
                //xxx_keyword
                sql = "select * from " + strDatabaseName + "_keyword";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataAdapter oda5 = new OracleDataAdapter(sql,
                    ConfigurationSettings.AppSettings["ConnectionString"]);
                oda5.Fill(nds.Tables["keyword"]);
                //xxx_onlinesrc
                sql = "select * from " + strDatabaseName + "_onlinesrc";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataAdapter oda6 = new OracleDataAdapter(sql,
                    ConfigurationSettings.AppSettings["ConnectionString"]);
                oda6.Fill(nds.Tables["onlinesrc"]);

                sql = "select onlinesrc_id from " + strDatabaseName + "_onlinesrc";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataReader odr6 = sh.ReturnDataReader(sql);
                if (odr6.Read())
                {
                    //xxx_dtbrlinkage
                    sql = "select * from " + strDatabaseName + "_dtbrlinkage";
                    sql += " where onlinesrc_id=" + odr6[0].ToString();
                    OracleDataAdapter oda10 = new OracleDataAdapter(sql,
                        ConfigurationSettings.AppSettings["ConnectionString"]);
                    oda10.Fill(nds.Tables["dtbrlinkage"]);

                    //xxx_dtdllinkage
                    sql = "select * from " + strDatabaseName + "_dtdllinkage";
                    sql += " where onlinesrc_id=" + odr6[0].ToString();
                    OracleDataAdapter oda11 = new OracleDataAdapter(sql,
                        ConfigurationSettings.AppSettings["ConnectionString"]);
                    oda11.Fill(nds.Tables["dtdllinkage"]);
                }
                //xxx_tpcat
                sql = "select * from " + strDatabaseName + "_tpcat";
                sql += " where metadata_id=" + odr1[0].ToString();
                OracleDataAdapter oda7 = new OracleDataAdapter(sql,
                    ConfigurationSettings.AppSettings["ConnectionString"]);
                oda7.Fill(nds.Tables["tpcat"]);
            }
            return nds;
        }

6.导出Oracle数据库的数据到XML文件中

        /// <summary>
        /// 导出Oracle数据库的数据到XML文件中
        /// </summary>
        /// <param name="strXmlPath">导出的目录</param>
        /// <param name="strDatabaseName">导出的数据库名称</param>
        public static void ExportXmlFromOracle(string strXmlPath, string strDatabaseName)
        {
            NewDataSet nds;
            SqlHelper sh = new SqlHelper();
            string sql = string.Empty;
            sql = "select mdid from " + strDatabaseName + "_metadata";

            OracleDataReader odr = sh.ReturnDataReader(sql);

            while (odr.Read())
            {
                string strMdid = odr[0].ToString();
                //根据元数据的ID得到一条元数据
                nds = GetOneMetaData(strMdid, strDatabaseName);

                nds.WriteXml(strXmlPath + "\\" + strMdid + ".xml");
            }
        }

7.下面两个函数实现treeview控件向XML转换,主要用于对元数据的编辑后保存到XML文件中。

        #region 遍历tree并实现向XML的转化
        /// <summary>      
        /// 遍历treeview并实现向XML的转化   
        /// </summary>      
        /// <param name="advTree">树控件对象</param>      
        /// <param name="strXmlFilePath">XML输出路径</param> 
        public static void TreeToXML(AdvTree advTree, string strXmlFilePath)
        {
            XmlTextWriter xtw = new XmlTextWriter(strXmlFilePath, null);
            XmlDocument xmlDoc = new XmlDocument();
            //控制格式并写XML的开头
            xtw.Formatting = Formatting.Indented;
            xtw.WriteStartDocument(true);
            xtw.WriteStartElement("metadata");
            xtw.WriteStartAttribute("xsi","noNamespaceSchemaLocation", "http://www.w3.org/2001/XMLSchema-instance");
            xtw.WriteEndAttribute();
            xtw.WriteEndElement();
            xtw.WriteEndDocument();
            xtw.Close();

            xmlDoc.Load(strXmlFilePath);
            XmlNode xnRoot = xmlDoc.SelectSingleNode("metadata");

            TransTreeToXml(xmlDoc, advTree.FindNodeByName("metadata").Nodes, (XmlElement)xnRoot, strXmlFilePath);
        }

        /// <summary>
        /// 转化Tree节点的数据到XML文档
        /// </summary>
        /// <param name="xmlDoc">XML文档对象</param>
        /// <param name="nodes">Tree的节点集合</param>
        /// <param name="xeRoot">根节点元素</param>
        /// <param name="strXmlPath">XML的节点路径</param>
        private static void TransTreeToXml(XmlDocument xmlDoc, 
            NodeCollection nodes, XmlElement xeRoot, String strXmlPath)
        {
            XmlElement xe;
            //遍历节点集合中的所有节点
            foreach (Node node in nodes)
            {
                //根据节点的名称创建一个新的XML节点元素
                xe = xmlDoc.CreateElement(node.Name);
                //将新建的XML节点元素添加到父亲节点(也就是传递进来的根节点)
                xeRoot.AppendChild(xe);
                //如果节点还有子节点就递归调用本函数
                if (node.Nodes.Count > 0)
                {
                    TransTreeToXml(xmlDoc, node.Nodes, xe, strXmlPath);
                }
                else
                {
                    //因为Tree节点数据的格式是:(名称:值),所以根据格式取出具体的值
                    string strTemp = node.Text.Substring(node.Text.IndexOf(':')+1);
                    //这个值不是空就填写新建的XML节点的值
                    if (strTemp != "")
                    {
                        //特殊处理graphOverview节点,因为它涉及到图形的二进制数据,需要转化为字符串
                        if (xe.Name == "graphOverview")
                        {
                            //以下就是将图形二进制数据转化为字符串
                            Bitmap bmp = new Bitmap(strTemp);
                            MemoryStream ms = new MemoryStream();   
                            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);   
                            byte[] arr = new byte[ms.Length];   
                            ms.Position = 0;   
                            ms.Read(arr, 0, (int)ms.Length);   
                            ms.Close();   
                            String strbaser64 = Convert.ToBase64String(arr);
                            //给节点填充值
                            xe.InnerText = strbaser64;
                        }
                        else
                        {
                            //给节点填充值
                            xe.InnerText = strTemp;
                        }
                    }
                }
            }
            xmlDoc.Save(strXmlPath);
        }

        #endregion

8.遍历XML并实现向tree控件的转化

        #region 遍历XML并实现向tree的转化
        /// <summary>      
        /// 遍历XML并实现向tree的转化 
        /// </summary>      
        /// <param name="strXmlFilePath">XML输入路径</param>      
        /// <param name="advTree">树控件对象</param>  
        public static void XMLToTree(string strXmlFilePath, AdvTree advTree)
        {
            //新建XML文档对象并载入XML文件数据
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(strXmlFilePath);
            //找到根节点
            XmlNodeList xnl = xmlDoc.GetElementsByTagName("metadata");
            XmlNode root = xnl[0];
            //根据找到的根节点遍历整个XML文件的节点
            foreach (XmlNode xn in root.ChildNodes)
            {
                //找到Tree对于的节点
                Node n = advTree.FindNodeByName(xn.Name);
                //如果有子节点就调用递归转化函数
                if (n.HasChildNodes)
                {
                    TransXMLToTree(xn.ChildNodes, advTree);
                }
                else
                {
                    //如果节点的内容不为空就为Tree控件节点添加值
                    if (xn.InnerText != "")
                    {
                        //标记已经有值,方便以后对Tree的编辑操作
                        n.Tag = "yes";
                        n.Text += xn.InnerText;
                        //如果此节点有父亲节点就把对于的父亲节点也标记为有值
                        while (n.Parent != null)
                        {
                            Node np = n.Parent;
                            np.Tag = "yes";
                            n = n.Parent;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 递归转化XML文件的节点到Tree的节点
        /// </summary>
        /// <param name="xmlNodes">XML文件的节点集合</param>
        /// <param name="advTree">Tree控件</param>
        private static void TransXMLToTree(XmlNodeList xmlNodes, AdvTree advTree)
        { 
            //循环遍历节点集合
            foreach (XmlNode xn in xmlNodes)
            {
                //根据XML的节点找到对于的Tree节点
                Node n = advTree.FindNodeByName(xn.Name);
                //如果还有子节点就递归转换
                if (n.HasChildNodes)
                {
                    TransXMLToTree(xn.ChildNodes, advTree);
                }
                else
                {
                    //如果节点的内容不为空就为Tree控件节点添加值
                    if (xn.InnerText != "")
                    {
                        //标记已经有值,方便以后对Tree的编辑操作
                        n.Tag = "yes";
                        n.Text += xn.InnerText;
                        //如果此节点有父亲节点就把对于的父亲节点也标记为有值
                        while (n.Parent != null)
                        {
                            Node np = n.Parent;
                            np.Tag = "yes";
                            n = n.Parent;
                        }
                    }
                }
            }
        }
        #endregion

9.将DataGridView显示的内容导出Excel

        /// <summary>
        /// 直接将DataGridView显示的内容导出Excel
        /// </summary>
        /// <param name="m_DataView"></param>
        public static void DataToExcel(DataGridView m_DataView)
        {
            int iRows = 0;   
            int iCols = 0;   
            int iTrueCols = 0;   
            Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();   
            Microsoft.Office.Interop.Excel._Workbook wb = app.Workbooks.Add(System.Reflection.Missing.Value);   
            Microsoft.Office.Interop.Excel._Worksheet ws = null;  
            if (wb.Worksheets.Count > 0)   
            {    
                ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);  
            }  
            else  
            {   
                wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, 
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value);   
                ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);   
            }   
            if (ws != null)    
            {   
                ws.Name = "sheet1";
                iRows = m_DataView.Rows.Count;          //加上列头行   
                iTrueCols = m_DataView.Columns.Count;   //包含隐藏的列,一共有多少列    
                //求列数,省略Visible = false的列   
                for (int i = 0; i < m_DataView.Columns.Count; i++)   
                {   
                   if (m_DataView.Columns[i].Visible) iCols++;   
                }   
                string[,] dimArray = new string[iRows + 1, iCols];   
 
                for (int j = 0, k = 0; j < iTrueCols; j++)   
                {   
                    //省略Visible = false的列
                    if (m_DataView.Columns[j].Visible)   
                    {   
                        dimArray[0, k] = m_DataView.Columns[j].HeaderText;   
                        k++;   
                    }   
                }   
                for (int i = 0; i < iRows; i++)   
                {   
                    for (int j = 0, k = 0; j < iTrueCols; j++)   
                    {   
                        //省略Visible = false的列
                        if (m_DataView.Columns[j].Visible)   
                        {
                            if (m_DataView.Rows[i].Cells[j].Value != null)
                            {
                                dimArray[i + 1, k] = m_DataView.Rows[i].Cells[j].Value.ToString();
                            }
                               
                            k++;   
                        }   
                    }   
                }    
                ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Value2 = dimArray;     
                ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Font.Bold = true;   
                ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Font.Size = 10.0;    
                ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).RowHeight = 14.25;   
               //ws.Columns[.ColumnWidth = datagridview.Columns[0].Width;   
                for (int j = 0, k = 0; j < iTrueCols; j++)   
                {   
                    //省略Visible = false的列
                    if (m_DataView.Columns[j].Visible)   
                    {   
                        ws.get_Range(ws.Cells[1, k + 1], ws.Cells[1, k + 1]).ColumnWidth =
                            (m_DataView.Columns[j].Width / 8.4) > 255 ? 255 : (m_DataView.Columns[j].Width / 8.4);   
                        //ws.Columns.c = datagridview.Columns[j].Width;   
                        k++;   
                    }   
                }   
            }
            //设置禁止弹出保存和覆盖的询问提示框   
            app.DisplayAlerts = false;
            app.AlertBeforeOverwriting = false;
            app.Visible = false;
            //保存工作簿  
            try
            {
                app.Save("temp");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                app.UserControl = false;
                app.Quit();
                File.Delete("temp.xlwx");
            }
        }

10.excel数据导入到DataGridView控件中

        /// <summary>
        /// Excel数据导入方法
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="dgv"></param>
        public static void EcxelToDataGridView(string filePath, DataGridView dgv)
        { 
            try
            {
                //根据路径打开一个Excel文件并将数据填充到DataSet中
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + filePath + ";Extended Properties ='Excel 8.0'";
                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
                string strExcel = "";
                OleDbDataAdapter myCommand = null;
                DataSet ds = null;
                strExcel = "select  * from   [sheet1$]";
                myCommand = new OleDbDataAdapter(strExcel, strConn);
                ds = new DataSet();
                myCommand.Fill(ds, "table1");

                //根据Excel的行逐一对上面构造的DataTable的列进行赋值
                foreach (DataRow excelRow in ds.Tables[0].Rows)
                {
                    int i = 0;
                    DataRow dr = ((System.Data.DataTable)dgv.DataSource).Rows.Add();
                    for (i = 0; i < ds.Tables[0].Columns.Count; ++i)
                    {
                        dr[i + 1] = excelRow[i];
                    }
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

11.数据备份与恢复

        /// <summary>
        /// 数据库备份或恢复
        /// </summary>
        /// <param name="strCmd">备份或恢复命令</param>
        /// <param name="strDmpFileName">dmp文件名称</param>
        /// <param name="strLogFileName">log文件名称</param>
        /// <returns>true:成功;false:失败</returns>
        public static bool DBBackup(string strCmd, string strDmpFileName, string strLogFileName)
        {
            // 返回值
            bool result = false;
            // cmd中输入的参数内容
            string arg = strCmd + " FILE= " + strDmpFileName + " LOG= " + strLogFileName;
            try
            {
                // 如果dmp文件不存在,创建文件并释放
                if (!File.Exists(strDmpFileName))
                {
                    File.Create(strDmpFileName).Dispose();
                }
                // 如果log文件不存在,创建文件并释放
                if (!File.Exists(strLogFileName))
                {
                    File.Create(strLogFileName).Dispose();
                }
                // 开启新进程
                Process p = new Process();
                // 打开运行cmd
                p.StartInfo.FileName = "cmd.exe";
                // 要运行的命令
                p.StartInfo.Arguments = arg;
                
                // 关闭shell的使用
                p.StartInfo.UseShellExecute = false;
                //p.StartInfo.RedirectStandardInput = true; 
                // 设置显示cmd运行界面
                p.StartInfo.CreateNoWindow = false;

                // 启动进程
                p.Start();
                
                p.WaitForExit();
                p.Dispose();
                result = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
            return result;
        } 

总结:这些功能放在一个类中可能不是很合理,但是当时是为了自己编程的方便,只要有多处实现的一些独立的功能,我就加入到这个类中来,并全部用静态的方法实现。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics