这次介绍两种方法,第一种是安装AccessDatabaseEngine,第二种是利用Npoi读取excel

一、第一种利用AccessDatabaseEngine进行读取excel文件

1.安装AccessDatabaseEngine

链接地址:http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe

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

整理之后,留着以后复习用的,如有问题,请留言

最新文章

  1. Servlet 单例多线程
  2. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
  3. C#传真传址 结构体
  4. 【学习笔记】Oracle-1.安装及配置
  5. MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)
  6. js的变量作用域 ,变量提升
  7. 【SQL】导出表数据到Excel中
  8. 段落排版--行间距, 行高(line-height)
  9. ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决
  10. jquery于form正在使用submit问题,未解决
  11. Visual C++学习笔记1:一定要注意ANSI和UNICODE差额
  12. 【OpenCV新手教程之十八】OpenCV仿射变换 &amp;amp; SURF特征点描写叙述合辑
  13. 【BZOJ3631】【JLOI2014】松鼠的新家
  14. 11-page分页原理
  15. MySQL中count函数使用方法详解
  16. webservice和dubbo区别
  17. crontab定时任务第一个周期未完成下一个周期执行就来了
  18. Python交互模式下代码自动补全
  19. Codeforces Round #419 (Div. 2) C. Karen and Game
  20. LOG EXPLORER ApexSQL Log

热门文章

  1. python的paramiko模块简单应用
  2. 关于block元素和inline元素
  3. 6-Qt给父widget加上styleSheet(添加背景图)而不改变子widget的styleSheet的方法
  4. php.ini memory_limit引起的问题
  5. Pycharm及python安装详细教程
  6. Bioconductor简介
  7. maven 打包 OutOfMemoryError
  8. OSGi 系列(十八)之 基于注解的 Blueprint
  9. 设计模式之prototype(原型模型)
  10. WebService测试工具介绍及下载