C#读取excel文件,并生成json
这次介绍两种方法,第一种是安装AccessDatabaseEngine,第二种是利用Npoi读取excel
一、第一种利用AccessDatabaseEngine进行读取excel文件
1.安装AccessDatabaseEngine
2.根据Excel文件获取所有的Sheet名称,获取每一个sheet的内容组装dataTable
(1)根据Excel文件获取所有的sheet名称
public 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=2;'", 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)
{
return new List<string>();
}
finally
{
if (connection != null)
{
connection.Close();
connection.Dispose();
}
if (dt != null)
{
dt.Dispose();
}
}
}
(2)获取每一个Sheet的内容组装dataTable
public 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=2;'", 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;
}
}
}
(3)table转json
public object ExcelToJson(string filePath)
{
string localPath = Server.MapPath(filePath);
List<string> tableNames = GetExcelSheetNames(localPath);
var json = new JObject();
tableNames.ForEach(tableName =>
{
var table = new JArray() as dynamic;
DataTable dataTable = GetExcelContent(localPath, 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);
});
return json.ToString();
}
最终生成的字符串:

二、利用NPOI读取excel
1.将excel文件中的内容读取出来,存放到DataSet中
#region 将Excel中的内容转换成DataSet
/// <summary>
/// 将Excel中的内容转换成DataSet
/// </summary>
/// <param name="filePath">路径</param>
/// <param name="excelHeader">第一行的文本</param>
/// <returns></returns>
public static DataSet ImportExcelToDataSet(string filePath,List<string> excelHead)
{
DataSet ds = new DataSet();
IWorkbook workbook;
string fileExt = Path.GetExtension(filePath).ToLower();
try
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
if (fileExt == ".xlsx")
{
workbook = new XSSFWorkbook(fs);//2007之后版本的excel
}
else
{
workbook = new HSSFWorkbook(fs);//2003版本的excel
}
for (int a = , b = workbook.NumberOfSheets; a < b; a++)
{
//获取读取的Sheet表的索引
ISheet sheet = workbook.GetSheetAt(a);
DataTable table = new DataTable();
IRow headerRow = sheet.GetRow(sheet.FirstRowNum);
int cellCount = headerRow.LastCellNum;
//将第一行的文本作为列名
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column;
object obj = GetValueType(headerRow.GetCell(i));
if (obj == null || obj.ToString() == string.Empty)
{
column = new DataColumn("Columns" + i.ToString());
}
else{
column = new DataColumn(GetType(obj.ToString()));
}
table.Columns.Add(column);
}
//读取第一行下面的数据,将他们作为数据行存储
for (int i = (sheet.FirstRowNum + ); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
if (row == null || row.GetCell() == null || row.GetCell().ToString().Trim() == "")
{
// 如果遇到第一个空行,跳出本次循环,继续向下读取
continue;
}
DataRow dataRow = table.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
dataRow[j] = row.GetCell(j).ToString();
}
}
table.Rows.Add(dataRow);
} ds.Tables.Add(table); }
workbook = null;
return ds;
}
}
catch (Exception ex)
{
return ds;
}
}
#endregion
注意:这是获取单元格类型的方法
#region 获取单元格类型
/// <summary>
/// 获取单元格类型
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
private static object GetValueType(ICell cell)
{
if (cell == null)
return null;
switch (cell.CellType)
{
case CellType.Blank: //BLANK:
return null;
case CellType.Boolean: //BOOLEAN:
return cell.BooleanCellValue;
case CellType.Numeric: //NUMERIC:
return cell.NumericCellValue;
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return "=" + cell.CellFormula;
}
}
#endregion
2.将DataTable转换成对应的list对象
#region DataTable内容转成List
/// <summary>
/// 将Excel中的内容转换成List
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns></returns>
public static List<CompanyMobileViewModel> CompanyList(string filePath)
{
List<CompanyMobileViewModel> mobileList = new List<CompanyMobileViewModel>();
try
{
//获取excel中的内容
var excelData = ImportExcelToDataSet(filePath,SetPhoneHeader()); //遍历DataSet
if (excelData.Tables.Count < )
{
return mobileList;
}
foreach (DataTable dt in excelData.Tables)
{
foreach (DataRow dr in dt.Rows)
{
for(var i=;i<dr.ItemArray.Length;i++)
{
//验证是否包含特殊字符
if (dr.ItemArray[i].ToString() != "" && GBCustomsHelper.ValidateSymbol(dr.ItemArray[i].ToString()) == true)
{
mobileList.Add(new CompanyMobileViewModel()
{
CompanyID = "js",
});
return mobileList;
}
}
mobileList.Add(new CompanyMobileViewModel()
{
CompanyID = dr.ItemArray[].ToString(),
MobileBusiness = dr.ItemArray[].ToString(),
MobileStatutory = dr.ItemArray[].ToString(),
State = ,
});
}
}
return mobileList;//然后再用一个方法接收这个返回值,这样excel的内容就读取出来了
}
catch (Exception ex)
{
return mobileList;
}
}
#endregion
3.将list对象转换成json,传递到前端
#region 将上传的excel中的内容转换成json
/// <summary>
/// 将上传的excel中的内容转换成json
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public object ExcelToJson(string filePath)
{
//数据总表
List<CompanyMobileViewModel> mobileView = CompanyList(filePath);
var jsonData=new{Rows=mobileView,Total=mobileView.Count()};
return Json(jsonData,JsonRequestBehavior.AllowGet);
}
对于这两种方法,个人感觉第二种利用NPOI读取excel更方便,不用在安装软件,省去很多的麻烦
本文参考:https://blog.csdn.net/xiaoxiao520c/article/details/77962326
整理之后,留着以后复习用的,如有问题,请留言
C#读取excel文件,并生成json的更多相关文章
- Java读取Excel文件转换成JSON并转成List——(七)
Jar包
- POI 读取Excel文件 并解析JSON数据
package skuPrice; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx ...
- C# API: 生成和读取Excel文件
我们想为用户提供一些数据,考虑再三, 大家认为对于用户(人,而非机器)的可读性, Excel文件要好一些. 因为相比csv,xml等文件, Excel中我们可以运用自动筛选, 窗口锁定, 还可以控制背 ...
- C# 读取EXCEL文件的三种经典方法
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...
- PHPExcel读取excel文件示例
PHPExcel读取excel文件示例PHPExcel最新版官方下载网址:http://phpexcel.codeplex.com/PHPExcel是一个非常方便生成Excel格式文件的类,官方下载包 ...
- ASP.NET读取EXCEL文件的三种经典方法(转)
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path) { str ...
- ASP.NET读取EXCEL文件的三种经典方法
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { ...
- asp.net读取excel文件多种方法
asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取. 方法一:采用OleDB读取Excel文件 把Excel文件 ...
- (转)C# 读取EXCEL文件的三种经典方法
原文地址http://www.open-open.com/code/view/1420029490093 1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取 ...
随机推荐
- 【深度好文】多线程之WaitHandle-->派生-》Mutex信号量构造
bool flag = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", ...
- vue2.0 element学习
1,bootstrap和vue2.0结合使用 vue文件搭建好后,引入jquery和bootstrap 我采用的方式为外部引用 在main.js内部直接导入 用vue-cli直接安装jquery和bo ...
- Luogu 3960 [NOIP2017] 列队 - splay|线段树
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...
- [SoapUI] Datasink怎么显示每次循环的结果
https://www.soapui.org/reporting/the-report-datasink.html
- java--多线程编程简介
1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...
- 乞丐版servlet容器第2篇
2. 监听端口接收请求 上一步中我们已经定义好了Server接口,并进行了多次重构,但是实际上那个Server是没啥毛用的东西. 现在要为其添加真正有用的功能. 大师说了,饭要一口一口吃,衣服要一件一 ...
- 19. Fight over Fox-hunting 猎狐引发的冲突
. Fight over Fox-hunting 猎狐引发的冲突 ① Foxes and farmers have never got on well.These small dog-like ani ...
- Django入门指南-第8章:第一个测试用例(完结)
python manage.py test python manage.py test --verbosity=2 # boards/tests.py from django.core.urlreso ...
- LA 3213 Ancient Cipher (水题,转化)
题意:给定两个长度相同的字符串,判断它们之间是否存在一一对应关系,顺序不定. 析:刚开始没看到顺序不定,然后写完没胡把样例看完就交了,结果WA了一次...其实这是一个水题,既然顺序不定,那么更简单,我 ...
- java中线程和并发面试题
http://www.cnblogs.com/dolphin0520/p/3932934.html http://www.cnblogs.com/dolphin0520/p/3958019.html ...