Excel动态生成JSON
在最近的一个项目中,有大量的数据源来至Excel,转成JSON供前台使用。Excel数据是人工录入的,难免会有错误,所以中间会有逻辑检查。在C#中读取Excel的方式有很多,网上一搜一大堆,这里我也贴出一个ExcelHelper,提供根据Excel文件获取所有Sheet名称和获取Sheet内容两个方法。使用的时候记得注册AccessDatabaseEngine,该驱动有64位、32位两个版本,请根据自己的环境选择正确的版本。
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Data.OleDb;
- using System.Linq;
- namespace Math.Library.Helper
- {
- public class ExcelHelper
- {
- 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 = ; i < table.Rows[].ItemArray.Length; i++)
- {
- var cloumnName = table.Rows[].ItemArray[i].ToString();
- if (!string.IsNullOrEmpty(cloumnName))
- table.Columns[i].ColumnName = cloumnName;
- }
- table.Rows.RemoveAt();
- return table;
- }
- }
- }
- 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 = ;
- foreach (DataRow row in dt.Rows)
- {
- excelSheets[i] = row["TABLE_NAME"].ToString().Split('$')[];
- 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();
- }
- }
- }
- }
- }
假如我的Excel数据如下,有班级和学生两张表(实际上有上百个Sheet,这里只做演示之用)。
当然我们不可能为每一个Sheet都对应做一个数据Model,不仅繁琐,还很容易出错。这时我想到了Newtonsoft.Json,Newtonsoft.Json是.NET下开源的JSON格式序列化和反序列化的类库。其中Newtonsoft.Json.Linq提供了对LINQ支持,支持动态对象、数组的序列化。
将整个Excel转换为一个JSON文件,每一个Sheet Name作为Key,Content就是Value,Value以数组形式存在,最终得到数据格式如下:
对应的代码如下,JArray和JObject是Newtonsoft.Json中的对象,支持动态属性和方法,表名和列名就是这样插入JSON中的。
- class Program
- {
- static void ExcelToJson()
- {
- List<string> tableNames = ExcelHelper.GetExcelSheetNames("test.xlsx");
- var json = new JObject();
- tableNames.ForEach(tableName =>
- {
- var table = new JArray() as dynamic;
- DataTable dataTable = ExcelHelper.GetExcelContent("test.xlsx", 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));
- }
- static void Main(string[] args)
- {
- ExcelToJson();
- }
- }
当然,为了减少前后端传输数据的流量,可以使用ToString(Formatting.None),这样生成出来的数据就没有格式了。
Excel动态生成JSON的更多相关文章
- C# 如何在Excel 动态生成PivotTable
Excel 中的透视表对于数据分析来说,非常的方便,而且很多业务人员对于Excel的操作也是非常熟悉的,因此用Excel作为分析数据的界面,不失为一种很好的选择.那么如何用C#从数据库中抓取数据,并在 ...
- JS 动态生成JSON对象
JS 动态生成JSON对象,一般用到JSON传递参数的时候,会用到. function onGeneratedRow(columnsResult) { var jsonData = {}; colum ...
- node读取excel文件生成JSON
当前的目录结构 excel的数据如下: node识别excel,先得安装 node-xlsx,用npm或yarn都可以 npm install node-xlsx 或 yarn add node- ...
- js动态生成JSON树
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C 简单处理excel 转成 json
引言 工作中常需要处理excel转json问题. 希望这篇博文能简单描述这个问题.并提供一种解决思路.提升感悟. 今天我们处理的事就是为了把 xlsm => json. 一种方式是. 去 goo ...
- 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)
ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...
- java动态生成带下拉框的Excel导入模板
在实际开发中,由于业务需要,常常需要进行Excel导入导出操作.以前做一些简单的导入时,先准备一个模板,再进行导入,单有十几. 二十几个导入模板时,往往要做十几.二十几个模板.而且,当在模板中需要有下 ...
- Jquery解析Json字符串,并且动态生成数据表格Table
//ajax获得后台传来的json字符串 $.post("UserInfo.ashx", function (data) { //假设data="{T1:[{User_I ...
- ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层
今年7月刚刚发布的ArcGIS 10.2为GIS的web开发带来了一个很实在的功能,JSON转要素.以往GIS图层外部数据(如文本数据,数据库数据)动态地写入地图服务中的图层是一件不可想象的事情,如今 ...
随机推荐
- *windows文件显示后缀名
- PCL—综述—三维图像处理
点云模型与三维信息 三维图像是一种特殊的信息表达形式,其特征是表达的空间中三个维度的数据.和二维图像相比,三维图像借助第三个维度的信息,可以实现天然的物体-背景解耦.除此之外,对于视觉测量来说,物体的 ...
- Django admin的一些有用定制
Model实例,myapp/models.py: from django.db import models class Blog(models.Model): name = models.CharFi ...
- (贪心5.2.1)UVA 10026 Shoemaker's Problem(利用数据有序化来进行贪心选择)
/* * UVA_10026.cpp * * Created on: 2013年10月10日 * Author: Administrator */ #include <iostream> ...
- IOS ARC与非ARC混合编译
要开启ARC的:-fobjc-arc不开启ARC的:-fno-objc-arc 是否使用arc: 在build setting里找automatic reference counting,YES/NO
- UVA 11916 Emoogle Grid(同余模)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- chrome控制台小技巧
对于大多数开发人员来说,chrome控制台最常用的命令就是 console.log()了,然后还有一些其他类似的命令,如: console.info() 提示信息 console.error() ...
- CodePage代码,MultiByteToWideChar
Identifier .NET Name Additional information 37 IBM037 IBM EBCDIC US-Canada 437 IBM437 OEM United Sta ...
- LeetCode Number of Islands 岛的数量(DFS,BFS)
题意:0代表水,1代表陆地,那么被水围起来的就是岛了,给一个01矩阵,问有多少个岛? 思路:DFS还是比较短,实现了一下.如果一个点已经被遍历过了,那就将其置为0就行了,不要去搜0的. class S ...
- Java [Leetcode 278]First Bad Version
题目描述: You are a product manager and currently leading a team to develop a new product. Unfortunately ...