C# excel转换Json

C# excel转换Json//如果要支持xlsx格式表格,请在本机电脑安装这个//http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe参考案例:https://www.cnblogs.com/fengxiang/p/3551621.html使用的时候记得…

大家好,又见面了,我是你们的朋友全栈君。

//如果要支持xlsx格式表格,请在本机电脑安装这个
//http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe

参考案例:https://www.cnblogs.com/fengxiang/p/3551621.html

使用的时候记得注册AccessDatabaseEngine,该驱动有64位、32位两个版本,请根据自己的环境选择正确的版本。

需求:有大量的数据源来自Excel,需要转成JSON供程序读取使用

假如我的Excel数据如下:

C# excel转换Json

这里我们用到了Newtonsoft.Json,Newtonsoft.Json是.NET下开源的JSON格式序列化和反序列化的类库。其中Newtonsoft.Json.Linq提供了对LINQ支持,支持动态对象、数组的序列化。JArray和JObject是Newtonsoft.Json中的对象,支持动态属性和方法,表名和列名就是这样插入JSON中的。

将整个Excel转换为一个JSON文件,每一个Sheet Name作为Key,Content就是Value,Value以数组形式存在,最终得到数据格式如下:

 

 

C# excel转换Json

为了减少前后端传输数据的流量,可以使用ToString(Formatting.None),这样生成出来的数据就没有格式了。

C# excel转换Json

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.OleDb;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;

namespace ExcelTool
{
    public class ExcelHelper
    {
        /// <summary>
        /// 获取excel的DataTable
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="sheetName"></param>
        /// <returns></returns>
        public static DataTable GetExcelContent(String filePath, string sheetName)
        {
            if (sheetName == "_xlnm#_FilterDatabase")
                return null;
            DataSet dateSet = new DataSet();
            String connectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=NO;IMEX=1;'", filePath);
            String commandString = string.Format("SELECT * FROM [{0}$]", sheetName);
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();
                using (OleDbCommand command = new OleDbCommand(commandString, connection))
                {
                    OleDbCommand objCmd = new OleDbCommand(commandString, connection);
                    OleDbDataAdapter myData = new OleDbDataAdapter(commandString, connection);
                    myData.Fill(dateSet, sheetName);
                    DataTable table = dateSet.Tables[sheetName];

                    for (int i = 0; i < table.Rows[0].ItemArray.Length; i++)
                    {
                        var cloumnName = table.Rows[0].ItemArray[i].ToString();
                        if (!string.IsNullOrEmpty(cloumnName))
                            table.Columns[i].ColumnName = cloumnName;
                    }
                    table.Rows.RemoveAt(0);
                    return table;
                }
            }
        }

        /// <summary>
        /// 获取excel文件里面的所有的工作表名称
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static List<string> GetExcelSheetNames(string filePath)
        {
            OleDbConnection connection = null;
            System.Data.DataTable dt = null;
            try
            {
                String connectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'", filePath);
                connection = new OleDbConnection(connectionString);
                connection.Open();
                dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if (dt == null)
                {
                    return new List<string>();
                }

                String[] excelSheets = new String[dt.Rows.Count];
                int i = 0;
                foreach (DataRow row in dt.Rows)
                {
                    excelSheets[i] = row["TABLE_NAME"].ToString().Split('$')[0];
                    i++;
                }
                return excelSheets.Distinct().ToList();
            }
            catch (Exception ex)
            {
               // LogHelper.Logger.Error(ex);
                return new List<string>();
            }
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                    connection.Dispose();
                }
                if (dt != null)
                {
                    dt.Dispose();
                }
            }
        }

        /// <summary>
        /// excel转换为json
        /// </summary>
        /// <param name="filePath"></param>
       public static void ExcelToJson(string filePath)
        {
            List<string> tableNames = ExcelHelper.GetExcelSheetNames(filePath);
            var json = new JObject();
            tableNames.ForEach(tableName =>
            {
                var table = new JArray() as dynamic;
                DataTable dataTable = ExcelHelper.GetExcelContent(filePath, tableName);
                foreach (DataRow dataRow in dataTable.Rows)
                {
                    dynamic row = new JObject();
                    foreach (DataColumn column in dataTable.Columns)
                    {
                        row.Add(column.ColumnName, dataRow[column.ColumnName].ToString());
                    }
                    table.Add(row);
                }
                json.Add(tableName, table);
            });
            Console.WriteLine(json.ToString());
            Console.WriteLine(json.ToString(Formatting.None));
        }
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132085.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 区块链与联邦学习的研究

    区块链与联邦学习的研究本文分别介绍了区块链与联邦学习的研究现状、架构和运行原理、主要技术及局限性,并针对区块链与联邦学习所存在的问题,通过分析区块链与联邦学习各自的特点,探讨了如何将区块链与联邦学习进行融合互补,介绍了两种融合模型及其应用场景。1区块链概述1.1 区块链的研究现状2008年10月,化名为“中本聪”的学者在密码学论坛上公开了《比特币:一种点对点的电子现金系统》一文[1],提出了利用PoW和时间戳机制构造交易区块的链式结构,剔除了可信第三方,实现了去中心化的匿名支付。比特币于2009年1月上线并发布创世块,.

    2022年9月6日
  • laravel 博客项目部署到Linux系统后报错 权限都设置为777,仍然报错没有权限

    laravel 博客项目部署到Linux系统后报错 权限都设置为777,仍然报错没有权限

    2021年10月27日
  • 华为的OD,值得去吗?「建议收藏」

    华为的OD,值得去吗?「建议收藏」最近有不少小伙伴接到了华为OD的面试邀约,但搞不清楚OD到底怎么回事儿,要不要去。所以今天来说说华为的OD到底是怎么回事儿,怎么判断是否值得去。1、华为的OD是怎么回事儿OD,是OutsourcingDispacth的缩写,简单粗暴地讲,就是外包派遣,劳务派遣。基本模式是这样的: A公司是外包公司(或劳务派遣公司,或人力资源公司); A公司签了一堆人,程序…

    2022年7月17日
  • 如何用ghost备份系统_服务器raid5如何做备份恢复

    如何用ghost备份系统_服务器raid5如何做备份恢复‍电脑安装完系统后,要及时对系统进行备份,这样系统出现什么问题,就可以快速恢复。我们可以用手动Ghost工具对系统进行备份操作。下面和系统城小编一起了解手动Ghost备份系统的具体操作。1、重启电脑,快速按F8,进入DOS界面,运行Ghost.exe;2、选择Local(本机)——Partition(分区)——ToImage(镜像),备份镜像文件到指定文件夹;3、选择备份源的磁盘驱动器(电脑硬盘…

    2022年9月6日
  • JS、ActiveXObject、Scripting.FileSystemObject

    JS、ActiveXObject、Scripting.FileSystemObjectJavascript之文件操作(IE)一、功能实现核心:FileSystemObject对象要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对象。&#1

    2022年7月1日
  • matlab中wavedec2,2-D wavelet decomposition

    matlab中wavedec2,2-D wavelet decompositionThisexampleshowsthestructureofwavedec2outputmatrices.Loadanddisplayanimage.loadwomanimagesc(X)colormap(map)Savethecurrentdiscretewavelettransformextensionmode.origMode=dwtmode(‘s…

    2022年7月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号