C#实现表格数据转实体的示例代码

目录
  • 场景
  • 需求
  • 开发环境
  • 开发工具
  • 实现代码
  • 实现效果

场景

在实际开发过程中,特别是接口对接之类的,对于这种需求是屡见不鲜,现在很多在线平台也都提供了像json转实体、sql转实体等。但是很多情况下,我们接收到的其实都是一份接口文档,在文档中利用表格标明了字段的名称、备注、类型等,而关于json什么的都是后来才有的,或者说,传输根本不用json。因此,表格数据能够转成实体类的需求就比较明显了。

需求

所以,综上场景所述,我们需要一个小工具,可以将表格数据直接转换为c#代码,当然,本着通用化的思想,小工具当然不会单纯的做一个读取excel文件的功能,这样一点也不好用,因为由其他地方提供的文档有的是excel,有的是word,所以,我们利用剪切板来做,只要解析剪切板的数据就可以了。

开发环境

.NET Framework版本:4.5

开发工具

Visual Studio 2013

实现代码

 public class GeneratorFieldModel
    {
        public string FieldDesc { get; set; }
        public string Modifier { get { return "public"; } }
        public string Type { get; set; }
        public string FieldName { get; set; }
        public string Property { get { return "{ get; set; }"; } }
        public bool IsNull { get; set; }
        public bool IsKey { get; set; }
        public string DefaultText { get; set; }

        readonly string startDesc = "\t\t/// <summary>";
        readonly string endDesc = "\t\t/// </summary>";

        public string FieldDescText
        {
            get
            {
                List<string> list = new List<string>();
                list.Add(startDesc);
                list.Add("\t\t///" + FieldDesc + "");
                list.Add(endDesc);
                return "\r\n" + string.Join("\r\n", list);
            }
        }

        public string PropertyText
        {
            get { return "\t\t" + string.Join(" ", Modifier, Type + (IsNull ? "?" : ""), FieldName, Property); }
        }
    }
public partial class Form_ToEntity : Form
    {
        BindingList<Entity> bindData = new BindingList<Entity>();
        public Form_ToEntity()
        {
            InitializeComponent();
        }
        private void Form_ToEntity_Load(object sender, EventArgs e)
        {
            string[] types = new string[]{
            "string",
            "decimal",
            "double",
            "int",
            "bool",
            "long"
            };
            DataGridViewComboBoxColumn dgvComboBox = Column2 as DataGridViewComboBoxColumn;
            dgvComboBox.Items.AddRange(types);
            dataGridView1.DataSource = bindData;
        }

        #region 处理点击选中着色
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            DataGridViewColumn selectColumn = dataGridView1.Columns[e.ColumnIndex];

            Color color = selectColumn.DefaultCellStyle.BackColor == Color.LightGray ? Color.White : Color.LightGray;
            selectColumn.DefaultCellStyle.BackColor = color;
            selectColumn.HeaderCell.Style.BackColor = color;
            selectColumn.Tag = color;
        }

        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.RowIndex == -1 && e.ColumnIndex > -1)
            {
                DataGridViewColumn selectColumn = dataGridView1.Columns[e.ColumnIndex];
                Color color = selectColumn.Tag == null ? Color.White : (Color)selectColumn.Tag;
                e.CellStyle.BackColor = color;
            }
        }

        #endregion

        /// <summary>
        /// 获取剪切板数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.V)
            {
                try
                {
                    string text = Clipboard.GetText();
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }

                    string[] clipData = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                    bindData = Clip2Entity(clipData);
                    dataGridView1.DataSource = new BindingList<Entity>(bindData);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        /// <summary>
        /// 将剪切板数据转换为表格数据
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private BindingList<Entity> Clip2Entity(string[] data)
        {
            BindingList<Entity> list = new BindingList<Entity>();

            foreach (string s in data)
            {
                Entity entity = new Entity();
                string[] arr = s.Split('\t');
                if (arr.Length == 2)
                {
                    //选中名称和类型
                    if (isCheck(dataGridView1.Columns[0]) && isCheck(dataGridView1.Columns[1]))
                    {
                        entity.name = arr[0];
                        entity.type = arr[1].ToLower();
                        entity.remark = "";
                    }
                    //选中名称和备注
                    if (isCheck(dataGridView1.Columns[0]) && isCheck(dataGridView1.Columns[2]))
                    {
                        entity.name = arr[0];
                        entity.type = "string";
                        entity.remark = arr[1];
                    }
                    //选中类型和备注
                    if (isCheck(dataGridView1.Columns[1]) && isCheck(dataGridView1.Columns[2]))
                    {
                        entity.name = "";
                        entity.type = arr[0].ToLower();
                        entity.remark = arr[1];
                    }
                }
                else if (arr.Length == 3)
                {
                    entity.name = arr[0];
                    entity.type = arr[1].ToLower();
                    entity.remark = arr[2];
                }
                else
                {
                    if (isCheck(dataGridView1.Columns[0]))
                    {
                        entity.name = s;
                        entity.type = "string";
                        entity.remark = "";
                    }
                    else if (isCheck(dataGridView1.Columns[1]))
                    {
                        entity.name = "";
                        entity.type = s.ToLower();
                        entity.remark = "";
                    }
                    else if (isCheck(dataGridView1.Columns[2]))
                    {
                        entity.name = "";
                        entity.type = "string";
                        entity.remark = s;
                    }
                }
                list.Add(entity);
            }
            return list;
        }
        /// <summary>
        /// 判断列是否被选中
        /// </summary>
        /// <param name="column"></param>
        /// <returns></returns>
        private bool isCheck(DataGridViewColumn column)
        {
            if (column.DefaultCellStyle.BackColor == Color.LightGray)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private class Entity
        {
            public string name { get; set; }
            public string type { get; set; }
            public string remark { get; set; }
        }

        private void btn_add_Click(object sender, EventArgs e)
        {
            bindData.Add(new Entity
            {
                type = "string"
            });
        }

        private void btn_delete_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                dataGridView1.Rows.Remove(row);
            }

        }

        private void btn_generate_Click(object sender, EventArgs e)
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach (Entity entity in bindData)
            {
                GeneratorFieldModel field = new GeneratorFieldModel
                {
                    FieldName = entity.name,
                    FieldDesc = entity.remark,
                    Type = entity.type
                };
                stringBuilder.AppendLine(field.FieldDescText);
                stringBuilder.AppendLine(field.PropertyText);
            }
            string path = Application.StartupPath + "\\entity.txt";
            File.WriteAllText(path, stringBuilder.ToString());
            Process.Start(path);
        }

    }

实现效果

代码解析:首先我们定义了一个GeneratorFieldModel类,在这个类中根据不同的字段属性进行了代码的拼接,这样就可以很方便的调用,直接把值传进去即可得到要生成的实体代码,然后在Ui中,首先处理了一下选中变色(标识我们要处理哪些数据列),然后就是分析剪切板数据,转化成需要的结构化数据(表格复制到剪切板的数据,其实就是以"\r\n"来分割的),显示到dataGridView中。

到此这篇关于C#实现表格数据转实体的示例代码的文章就介绍到这了,更多相关C#表格数据转实体内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c# 将Datatable数据导出到Excel表格中

    话不多说,请看代码: public FileResult GetExcelFile() { if (Session["beginDate"] != null) { string bdate = Session["beginDate"].ToString(); DateTime ld = Convert.ToDateTime(Session["lastDate"].ToString()); DateTime ldate = ld.AddDays(1

  • C#数据表格(DataGridView)控件的应用案例

    我们通过一个完整的实例来实现课程信息管理功能的操作,包括查询.修改.删除课程信息的操作. 为了简化实例,添加课程信息的操作直接在 SQL Server 数据库中完成. 下面分几个步骤完成. 1) 创建课程信息表创建课程信息表的 SQL 语句如下. use test; create table course ( id int primary key identity(1,1), name varchar(20), credit numeric(3,1), remark varchar(50) );

  • C#使用Ado.Net更新和添加数据到Excel表格的方法

    本文实例讲述了C#使用Ado.Net更新和添加数据到Excel表格的方法.分享给大家供大家参考.具体分析如下: 微软NET提供了一个交互的方法,通过使用ADO.NET与Microsoft Office程序.内置的OLEDB提供可以用来操纵Excel的.xls电子表格.您可以在Excel中创建一个命名的范围确定表名,我们还需要列标题,如果电子表格中不包含列标题,那么你就需要将它们添加. 如何在Excel中创建一个命名的范围? 随着电子表格打开,选择你希望包括数据查询,包括标题. 选择"插入&quo

  • C#读取word中表格数据的方法实现

    前些日子有一个项目需要从word文件中取表格数据并进行处理,网上大部分方案都是基于office的com组件实现,但是这样有一个缺点,如果电脑里没有安装office将无法使用,因为之前操作excel都是使用的NPOI,所以理所当然的想用NPOI解决此问题. 于是找到了如下代码 private List<string> GetDoc(string Path) { if (Path == "") return null; //文件路径为空 List<string> R

  • C#实现表格数据转实体的示例代码

    目录 场景 需求 开发环境 开发工具 实现代码 实现效果 场景 在实际开发过程中,特别是接口对接之类的,对于这种需求是屡见不鲜,现在很多在线平台也都提供了像json转实体.sql转实体等.但是很多情况下,我们接收到的其实都是一份接口文档,在文档中利用表格标明了字段的名称.备注.类型等,而关于json什么的都是后来才有的,或者说,传输根本不用json.因此,表格数据能够转成实体类的需求就比较明显了. 需求 所以,综上场景所述,我们需要一个小工具,可以将表格数据直接转换为c#代码,当然,本着通用化的

  • SpringBoot结合JSR303对前端数据进行校验的示例代码

    一.校验分类 数据的校验一般分为**前端校验.后端校验** 二.前端校验 前端校验是最为明显的,先说一下: ① HTML 非空校验 如 HTML5 新增的属性required="true",一旦没有填写就输入框就显示红色,具体使用如: <input type="text" id="name" name="name" required="true"/> ② JS 同时在提交表单发送 Ajax请求

  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    目录 1.SpringBoot项目整合JPA 1.1 pom.xml依赖 1.2 application配置文件 2.创建实体类 3.启动项目,测试验证 1.SpringBoot项目整合JPA 1.1 pom.xml依赖 <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &

  • 使用react实现手机号的数据同步显示功能的示例代码

    本文介绍了使用react实现手机号的数据同步显示功能的示例代码,分享给大家,具体如下: 要求如下 输入框输入内容数据长度大于0,展示出预览信息 光标离开关闭预览信息 预览信息每隔4位插入一个特殊字符_,输入内容不变 限制长度为13位 只允许输入数字(0-9) // Zinput.js import React, { Component } from 'react'; import './Zinput.css' // NOTE: 获取焦点事件 原生onFocus 即可 // NOTE: 离开焦点事

  • matplotlib实现数据实时刷新的示例代码

    前言 matplotlib是python下非常好用的一个数据可视化套件,网上相关的教程也非常丰富,使用方便.本人需求一个根据实时数据刷新曲线的上位机软件,找了半天,基本上都是使用matplotlib的交互模式,我折腾半天还是没有实现想要的效果,但却通过另一种方法实现了想要的效果. 源码 注释已经很充分,不多赘述,直接看源码. import matplotlib.pyplot as plt import numpy as np import threading import sys from ra

  • MySQL/MariaDB 如何实现数据透视表的示例代码

    前文介绍了Oracle 中实现数据透视表的几种方法,今天我们来看看在 MySQL/MariaDB 中如何实现相同的功能. 本文使用的示例数据可以点此下载. 使用 CASE 表达式和分组聚合 数据透视表的本质就是按照行和列的不同组合进行数据分组,然后对结果进行汇总:因此,它和数据库中的分组(GROUP BY)加聚合函数(COUNT.SUM.AVG 等)的功能非常类似. 我们首先使用以下 GROUP BY 子句对销售数据进行分类汇总: select coalesce(product, '[全部产品]

  • python3美化表格数据输出结果的实现代码

    技术背景 在前面一篇博客中我们介绍过关于python的表格数据处理方案,这其中的工作重点就是对表格类型的数据进行梳理.计算和展示,本文重点介绍展示这个方面的工作.首先我们看一个案例,定义一个数组形式的表格数据: [dechin@dechin-manjaro table]$ ipython Python 3.8.5 (default, Sep 4 2020, 07:30:14) Type 'copyright', 'credits' or 'license' for more informatio

  • AngularJs导出数据到Excel的示例代码

    公司一个新的需求导出Exce表格,研究了一下,最后终于实现,分享给大家. 1 使用FileSaver 第一次采用FileSaver.js 由于刚开始导致导出一片空白,还只能抓取网页里面的表格地址:https://github.com/eligrey/FileSaver.js HTML <div id="exportable"> <table width="100%"> <thead> <tr> <th>Na

  • Ajax叠加(Ajax返回数据用Ajax发出)示例代码

    最近在做人事管理系统的一个签到功能,首先是把部门当做参数,把参数用Ajax发送到数据库进行查询,然后以表格形式动态生成员工信息到返回页面的Div里,表格最后的一列是签到按钮,这时我想用JQuery继续获取被点击的"签到"按钮,然后用Ajax将数据发送到数据库签到表,更新签到表,于是我就把每个签到按钮的id属性设置成第一次Ajax返回的每个员工信息的工号,再次用JQuery获取,怎么获取呢?想到了标签加事件选择器,于是写了下面代码: 复制代码 代码如下: $(function(){ $(

  • vue+element的表格实现批量删除功能示例代码

    最近写了一个批量删除功能,遇到了不少坑,特此记录一下 表格的代码如下 复制代码 代码如下: <el-table @row-click="handleCurrentChange" @selection-change="selsChange" ref="table" :data="pageData" stripe :default-sort="{prop: 'createAt', order: 'descendin

随机推荐