在最近的一个项目中,有大量的数据源来至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的更多相关文章

  1. C# 如何在Excel 动态生成PivotTable

    Excel 中的透视表对于数据分析来说,非常的方便,而且很多业务人员对于Excel的操作也是非常熟悉的,因此用Excel作为分析数据的界面,不失为一种很好的选择.那么如何用C#从数据库中抓取数据,并在 ...

  2. JS 动态生成JSON对象

    JS 动态生成JSON对象,一般用到JSON传递参数的时候,会用到. function onGeneratedRow(columnsResult) { var jsonData = {}; colum ...

  3. node读取excel文件生成JSON

    当前的目录结构 excel的数据如下: node识别excel,先得安装  node-xlsx,用npm或yarn都可以 npm install  node-xlsx 或 yarn add node- ...

  4. js动态生成JSON树

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. C 简单处理excel 转成 json

    引言 工作中常需要处理excel转json问题. 希望这篇博文能简单描述这个问题.并提供一种解决思路.提升感悟. 今天我们处理的事就是为了把 xlsm => json. 一种方式是. 去 goo ...

  6. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)

    ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...

  7. java动态生成带下拉框的Excel导入模板

    在实际开发中,由于业务需要,常常需要进行Excel导入导出操作.以前做一些简单的导入时,先准备一个模板,再进行导入,单有十几. 二十几个导入模板时,往往要做十几.二十几个模板.而且,当在模板中需要有下 ...

  8. Jquery解析Json字符串,并且动态生成数据表格Table

    //ajax获得后台传来的json字符串 $.post("UserInfo.ashx", function (data) { //假设data="{T1:[{User_I ...

  9. ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层

    今年7月刚刚发布的ArcGIS 10.2为GIS的web开发带来了一个很实在的功能,JSON转要素.以往GIS图层外部数据(如文本数据,数据库数据)动态地写入地图服务中的图层是一件不可想象的事情,如今 ...

随机推荐

  1. 253. Meeting Rooms II

    题目: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] ...

  2. laravel速记(笔记)

    命令行: php artisan controller:make UserController This will generate the controller at /app/controller ...

  3. C/C++技巧

    C中如何调用C++函数 将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用).例如: // C ...

  4. android从应用到驱动之—camera(2)---cameraHAL的实现

    本来想用这一篇博客把cameraHAL的实现和流程都给写完的.搞了半天,东西实在是太多了.这篇先写cameraHAL的基本实现框架,下一篇在具体写camerahal的流程吧. cameraHAL的实现 ...

  5. WINCE 开机自动弹USB连接窗口问题(已解决)

    平台:S3C6410+WinCE6.0 问题现像: 当启用UART0也就是COM1时,无论插没插USB线,一开机,它都会弹出个USB连接的窗口, 原因分析: 是因为在三星原版本BSP里的串口驱动上制定 ...

  6. devDependencies和dependencies的区别

    我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...

  7. HDU 4948

    题目大义: 给一张图,任意两点间有单向边,找出一种方案,使得每个新入队的点与队中的点距离<=2. 题解: 贪心,从最后入队点开始反向插入,每次找出最大入度的点入队. 只需证明最大入度点A与所有未 ...

  8. bzoj2245: [SDOI2011]工作安排

    费用流. 这道题的模型比较明显,拆点也是很容易看出来的. #include<cstdio> #include<algorithm> #include<cstring> ...

  9. 【笨嘴拙舌WINDOWS】API

    如今,相对于大行其道的对象,服务,API概念的提出要早很多,却依然经久不衰:所谓万变不离其宗,如今很多服务(Web Services,云服务)的提供方式和API如出一辙. Windows API(Ap ...

  10. Dapper使用在WCF上总是说Service找不到

    原因是用Console Application 做宿主的时候,创建的时候默认是Client Profile 4 ,坑爹啊.改成Net framework 4 即可.