c# 从0实现一个温湿度监测的小工具 (13)

905 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

优化

本章节主要对软件进行优化,主要包含以下几点:

  • 历史数据增加excel导出
  • 实现侧边栏隐藏
  • 增加软件logo

增加软件logo

logo增加比较简单,制作一个ico格式的图片,再工程的属性中选择ico即可

image.png

另外,需要把我们主窗口的ico同样替换成这个logo图片,启动后结果如下图:

image.png

实现侧边栏隐藏

侧边栏的隐藏,需要修改mianform.cs
我们之前在设计框架的时候,在侧边栏和工作区中间预留了一个panel,基于这个panel,实现点击panel后:侧边栏隐藏,再点击后,侧边栏展现。

在panel上添加lable,用于文字提示

修改panel的size,width设置为25
放置一个lable到panel,docker:fill,autosize:false 完成如下图:

image.png

实现点击lable的回调函数,比较简单,通过部件的hide实现,code如下:

        /// <summary>
        /// 隐藏侧边栏
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label1_Click(object sender, EventArgs e)
        {
            if (ShowLeftBar)
            {
                this.treeView1.Hide();
                ShowLeftBar = false;
                this.label1.Text = ">>>>>>>>>>";
            }
            else
            {
                this.label1.Text = "<<<<<<<<<<";
                this.treeView1.Show();
                ShowLeftBar = true;
            }
        }

效果如下:

展开:

image.png

隐藏:

image.png

历史数据增加excel导出

增加excel导出功能

在common文件夹下,新增数据导出类,dataexp.cs
安装nuget包:npio用来导出excel
实现导出函数:

using System;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;

namespace THSensor
{
    internal class DataExp
    {
        /// <summary>
        /// 将DataTable(DataSet)导出到Execl文档
        /// </summary>
        /// <param name="dataSet">传入一个DataSet</param>
        /// <param name="Outpath">导出路径(可以不加扩展名,不加默认为.xls)</param>
        /// <returns>返回一个Bool类型的值,表示是否导出成功</returns>
        /// True表示导出成功,Flase表示导出失败
        public static bool DataTableToExcel(DataSet dataSet, string Outpath)
        {
            bool result = false;
            try
            {
                if (dataSet == null || dataSet.Tables == null || dataSet.Tables.Count == 0 || string.IsNullOrEmpty(Outpath))
                    throw new Exception("输入的DataSet或路径异常");
                int sheetIndex = 0;
                //根据输出路径的扩展名判断workbook的实例类型
                IWorkbook workbook = null;
                string pathExtensionName = Outpath.Trim().Substring(Outpath.Length - 5);
                if (pathExtensionName.Contains(".xlsx"))
                {
                    workbook = new XSSFWorkbook();
                }
                else if (pathExtensionName.Contains(".xls"))
                {
                    workbook = new HSSFWorkbook();
                }
                else
                {
                    Outpath = Outpath.Trim() + ".xls";
                    workbook = new HSSFWorkbook();
                }
                //将DataSet导出为Excel
                foreach (DataTable dt in dataSet.Tables)
                {
                    sheetIndex++;
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        ISheet sheet = workbook.CreateSheet(string.IsNullOrEmpty(dt.TableName) ? ("sheet" + sheetIndex) : dt.TableName);//创建一个名称为Sheet0的表
                        //行数
                        int rowCount = dt.Rows.Count;
                        //列数
                        int columnCount = dt.Columns.Count;
                        //设置列头
                        //excel第一行设为列头
                        IRow row = sheet.CreateRow(0);
                        for (int c = 0; c < columnCount; c++)
                        {
                            ICell cell = row.CreateCell(c);
                            cell.SetCellValue(dt.Columns[c].ColumnName);
                        }
                        //设置每行每列的单元格,
                        for (int i = 0; i < rowCount; i++)
                        {
                            row = sheet.CreateRow(i + 1);
                            for (int j = 0; j < columnCount; j++)
                            {
                                //excel第二行开始写入数据
                                ICell cell = row.CreateCell(j);
                                double value;
                                if (double.TryParse(dt.Rows[i][j].ToString(), out value))
                                    cell.SetCellValue(value);
                                else
                                    cell.SetCellValue(dt.Rows[i][j].ToString());
                            }
                        }
                    }
                }
                //向outPath输出数据
                using (FileStream fs = File.OpenWrite(Outpath))
                {
                    //向打开的这个xls文件中写入数据
                    workbook.Write(fs);
                    result = true;
                }
                return result;
            }
            catch (Exception ex)
            {
                MyLogger._.Error(ex.Message + ex.StackTrace);
                return false;
            }
        }
    }
}

修改界面

界面修改tablelayoutpanle,增加两行,一行5,一行40
在最后一列放置一个按钮,用来实现数据导出

image.png

实现数据导出的回调:

        /// <summary>
        /// 数据导出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            DataSet dtset = new DataSet();
            DataTable temp = DataBuffer.Copy();
            dtset.Tables.Add(temp);
            //导出
            string filename = $"{AppDomain.CurrentDomain.BaseDirectory}Output\\outputdata.xls";
            if (!DataExp.DataTableToExcel(dtset, filename))
            {
                MessageBox.Show("导出失败");
                return;
            }
            if (MessageBox.Show("导出成功\r\n是否打开目录?", "Confirm Message", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                //MessageBox.Show(path);
                System.Diagnostics.Process.Start("Explorer.exe", filename);
            }
        }

测试结果

image.png

导出后的数据:

image.png