0
点赞
收藏
分享

微信扫一扫

基于C#的矩形线圈磁场计算(数据可以保存至表格中)

一、主要程序段

1.登录表格,创建datagridview1

#region 程序登录即创建datagridview
        private void Form1_Load(object sender, EventArgs e)
        {
            //根据Header和所有单元格的内容自动调整行的高度
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
            //添加10列
            for (int i = 0; i < 11; i++)
            {
                dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
                dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;  //设置所有列自适应宽度
            }
            //三列的标题
            dataGridView1.Columns[0].HeaderText = label12.Text;
            dataGridView1.Columns[1].HeaderText = label5.Text;
            dataGridView1.Columns[2].HeaderText = label9.Text;
            dataGridView1.Columns[3].HeaderText = label10.Text;
            dataGridView1.Columns[4].HeaderText = label1.Text;
            dataGridView1.Columns[5].HeaderText = label2.Text;
            dataGridView1.Columns[6].HeaderText = label3.Text;
            dataGridView1.Columns[7].HeaderText = label4.Text;
            dataGridView1.Columns[8].HeaderText = label8.Text;
            dataGridView1.Columns[9].HeaderText = label7.Text;
            dataGridView1.Columns[10].HeaderText = label6.Text;
            //设置对齐方式和字体
            dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dataGridView1.Font = new Font("宋体", 15);
            textBox1.Text = "150";
            textBox2.Text = "20";
            textBox3.Text = "10";
            textBox4.Text = "3";
            textBox5.Text = "4";
            textBox6.Text = "5";
            textBox7.Text = "6";
            button2.Enabled = false;
        }
        #endregion

2.设计矩形线圈磁场计算公式实现

#region 矩形线圈磁场计算公式实现
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //令结果显示文本框只读。
                textBox8.ReadOnly = true;
                textBox9.ReadOnly = true;
                textBox10.ReadOnly = true;
                textBox11.ReadOnly = true;
                //读取线圈参数和坐标值
                double la_in = Convert.ToSingle(textBox1.Text);
                double lb_in = Convert.ToSingle(textBox2.Text);
                double lI = Convert.ToSingle(textBox3.Text);
                double ln = Convert.ToSingle(textBox4.Text);
                double Xi = Convert.ToSingle(textBox5.Text);
                double Yi = Convert.ToSingle(textBox6.Text);
                double Zi = Convert.ToSingle(textBox7.Text);
                double la = la_in / 2;
                double lb = lb_in / 2; //长方形线圈长150米,宽20米。
                double u0 = 4 * Math.PI * Math.Pow(10, -7);// 令U0 = 4π * 10(-7),计算得磁感应强度(T)
                double beita = Math.Pow(10, 9);// 比例系数,磁感应强度(T)转换为磁感应强度(nT)
                //空间坐标Xi,Yi,Zi; Xi为 - 0.9l1到 + 0.9l1; Yi为 - 0.9l2到 + 0.9l2; Zi为0到 - 20; 
                if (Math.Abs(Xi) <= 1.9 * la)
                {
                    if (Math.Abs(Yi) <= 1.9 * lb)
                    {
                        if (Math.Abs(Zi) <= 21)
                        {
                            //1.Bz计算
                            //Babz计算
                            double zab1 = (1 / (4 * Math.PI * (Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (lb + Yi);
                            double zab2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
                            double zab3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
                            double Babz = zab1 * (zab2 + zab3);
                            //Bbcz计算
                            double zbc1 = (1 / (4 * Math.PI * (Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (lb - Yi);
                            double zbc2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
                            double zbc3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
                            double Bbcz = zbc1 * (zbc2 + zbc3);
                            //Bcdz计算
                            double zcd1 = (1 / (4 * Math.PI * (Math.Pow((la - Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (la - Xi);
                            double zcd2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
                            double zcd3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
                            double Bcdz = zcd1 * (zcd2 + zcd3);
                            //Bdaz计算
                            double zda1 = (1 / (4 * Math.PI * (Math.Pow((la + Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (la + Xi);
                            double zda2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
                            double zda3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
                            double Bdaz = zda1 * (zda2 + zda3);
                            double Bz_tmp = (Babz + Bbcz + Bcdz + Bdaz) * ln * beita;// 单位为nT
                            double Bz = Math.Round(Bz_tmp, 3);

                            //2.Bx计算
                            //Babx计算
                            double xab1 = (1 / (4 * Math.PI * (Math.Pow((la - Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
                            double xab2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
                            double xab3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
                            double Babx = xab1 * (xab2 + xab3);

                            //Bdax计算
                            double xda1 = (1 / (4 * Math.PI * (Math.Pow((la + Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
                            double xda2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
                            double xda3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
                            double Bdax = xda1 * (xda2 + xda3);

                            double Bx_tmp = (Babx - Bdax) * ln * beita;// 单位为nT
                            double Bx = Math.Round(Bx_tmp, 3);

                            //3.By计算
                            //Bbcy计算
                            double ybc1 = (1 / (4 * Math.PI * (Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
                            double ybc2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
                            double ybc3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
                            double Bbcy = ybc1 * (ybc2 + ybc3);

                            //Babz计算
                            double yab1 = (1 / (4 * Math.PI * (Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
                            double yab2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
                            double yab3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
                            double Baby = yab1 * (yab2 + yab3);

                            double By_tmp = (Bbcy - Baby) * ln * beita;// 单位为nT
                            double By = Math.Round(By_tmp, 3);

                            double B = Math.Round(Math.Sqrt(Math.Pow(Bx_tmp, 2) + Math.Pow(By_tmp, 2) + Math.Pow(Bz_tmp, 2)),3);


                            textBox8.Text = Convert.ToString(Bz);
                            textBox9.Text = Convert.ToString(Bx);
                            textBox10.Text = Convert.ToString(By);
                            textBox11.Text = Convert.ToString(B);
                            //datagridview操作
                            int index = this.dataGridView1.Rows.Add();//添加新行,index返回行号
                            this.dataGridView1.Rows[index].Cells[0].Value = textBox11.Text;
                            this.dataGridView1.Rows[index].Cells[1].Value = textBox8.Text;
                            this.dataGridView1.Rows[index].Cells[2].Value = textBox9.Text;
                            this.dataGridView1.Rows[index].Cells[3].Value = textBox10.Text;
                            this.dataGridView1.Rows[index].Cells[4].Value = textBox1.Text;
                            this.dataGridView1.Rows[index].Cells[5].Value = textBox2.Text;
                            this.dataGridView1.Rows[index].Cells[6].Value = textBox3.Text;
                            this.dataGridView1.Rows[index].Cells[7].Value = textBox4.Text;
                            this.dataGridView1.Rows[index].Cells[8].Value = textBox5.Text;
                            this.dataGridView1.Rows[index].Cells[9].Value = textBox6.Text;
                            this.dataGridView1.Rows[index].Cells[10].Value = textBox7.Text;

                            //自动滚动显示到最后一行
                            this.dataGridView1.FirstDisplayedScrollingRowIndex = this.dataGridView1.Rows.Count - 1;
                            //datagridview换行变色
                            for (int i = 0; i < dataGridView1.Rows.Count; i++)//遍历所有的行
                            {
                                if (i % 2 == 0) //判断行索引为偶数
                                    dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.LightSkyBlue;//隔行更换背景色

                            }
                            button2.Enabled = true;
                        }
                        else
                        {
                            MessageBox.Show("Zi的值要在±21内");
                        }
                    }
                    else
                    {
                        MessageBox.Show("Yi的值要在±0.95倍线圈宽度之间");
                    }
                }
                else
                {
                    MessageBox.Show("Xi的值要在±0.95倍线圈宽度之间");
                }
            }//end try
            catch (Exception ex)
            {
                MessageBox.Show("错误!");
            }
        }
        #endregion

3.保存数据至表格,表格位置设定在D盘根目录

#region ExportExcel
        public void ExportExcel(string fileName, DataGridView dgv,string strDate )
        {
            //设置导出文件路径
            //string path = HttpContext.Current.Server.MapPath("Export/");
            //设置新建文件路径及名称
            //string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls";
            FileInfo finfo = new FileInfo(fileName);
            FileStream file = null;
            if (finfo.Exists)
            {
                try
                {
                    //打开文件
                    //file = new FileStream(fileName, FileMode.Append, FileAccess.Write);
                    //以指定的字符编码向指定的流写入字符
                }
                catch (Exception ex)
                {
                    MessageBox.Show("文件打开失败!");
                    GC.Collect();//强行销毁,系统回收资源
                }
            }
            else
            {
                try
                {
                    string saveFileName = "";
                    SaveFileDialog saveDialog = new SaveFileDialog();
                    saveDialog.DefaultExt = "xls";
                    saveDialog.Filter = "Excel文件|*.xls";
                    saveDialog.FileName = fileName;
                    saveDialog.ShowDialog();
                    saveFileName = saveDialog.FileName;
                    if (saveFileName.IndexOf(":") < 0) return; //被点了取消
                    //创建文件
                    file = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("文件已存在,保存失败!");
                    GC.Collect();//强行销毁,系统回收资源
                }
            }
            
            sw.Flush();
            file.Flush();
            sw.Close();
            sw.Dispose();
            file.Close();
            file.Dispose();
            MessageBox.Show("保存成功!");
            dgv.Rows.Clear();
        }
        #endregion

二、关键点

1.自动滚动显示到最后一行


                            this.dataGridView1.FirstDisplayedScrollingRowIndex = this.dataGridView1.Rows.Count - 1;

2.datagridview换行变色


                            for (int i = 0; i < dataGridView1.Rows.Count; i++)//遍历所有的行
                            {
                                if (i % 2 == 0) //判断行索引为偶数
                                    dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.LightSkyBlue;//隔行更换背景色

                            }

3.写数据到excel

此处只考虑将数据写入到exl文件中,经过网上查找方法,采用较为简单的字符串方式处理。

打包资源已上传:

C#实现线圈磁场计算,数据datagridview可视化,在.net4.5基础上不依赖任何其他组件完成数据保存至excel表格。-C#文档类资源-CSDN下载

举报

相关推荐

0 条评论