Excel文件读、写可以使用Office自带的库(Microsoft.Office.Interop.Excel),前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题。
还可以使用NPOI,在不安装office的时候也是可以读写的,速度很快。当然,还有支持Excel2007以上版本的OpenXml。以及其他一些开源项目,由于本人不太熟悉,在此不做过多介绍。
  为了解决烦人Office版本兼容问题,本项目-ShiQuan.Offices 决定采用基于NPOI,进行Excel文件读、写操作。
  本项目目前实现内容包括:
  1、直接根据DataTable,生成Excel文件内容。
  2、根据列表设置和DataTable,生成Excel文件内容。
  3、根据Excel模板,使用模板设置,生成Excel文件内容。
  4、读取Excel内容,返回DataTable。

  本项目基于LGPL3.0开源,供大家参考、使用,欢迎提供宝贵意见!
  项目源码:https://gitee.com/ShiQuanSoft/ShiQuan.Offices

  下面介绍分享如何使用该项目-ShiQuan.Offices。
  首先,创建ConsoleApp测试项目,添加程序包安装:

     

1、先我们试下,普通的DataTable生成Excel文件是怎样的?

try
{
//取出数据源
DataTable dtData = new DataTable();
dtData.Columns.Add("account");
dtData.Columns.Add("realname");
dtData.Columns.Add("birthday");
dtData.Columns.Add("description");
dtData.Columns.Add("remark"); DataRow dr = dtData.NewRow();
dr["account"] = "账户";
dr["realname"] = "姓名";
dr["birthday"] = "2000-05-25";
dr["description"] = "说明";
dr["remark"] = "说明";/*多余字段,不会数据导出*/
dtData.Rows.Add(dr);
Console.WriteLine("生成2007以上版本Excel...");
NPOIHelper.SaveToExcel(dtData, "XSSFWorkbook.xlsx");
Console.WriteLine("生成2003版本Excel...");
NPOIHelper.SaveToExcel(dtData, "HSSFWorkbook.xls");
}
catch (Exception ex)
{
Console.WriteLine("导出异常:" + ex.Message);
}

  运行效果:

  2、一般从系统中导出Excel,我们都将采用中文标题,设置相应的数据列格式,对齐方式等信息?

try
{
//取出数据源
DataTable dtData = new DataTable();
dtData.Columns.Add("account");
dtData.Columns.Add("realname");
dtData.Columns.Add("gender");
dtData.Columns.Add("birthday");
dtData.Columns.Add("enabled");
dtData.Columns.Add("price");
dtData.Columns.Add("percent");
dtData.Columns.Add("money");
dtData.Columns.Add("remark"); DataRow dr = dtData.NewRow();
dr["account"] = "账户";
dr["realname"] = "姓名";
dr["gender"] = "";/*0:女*/
dr["birthday"] = "2000-05-25";
dr["price"] = "10.5656";
dr["percent"] = "0.56";
dr["money"] = "1000.56";
dr["enabled"] = "";/*是否启用:1:是*/
dr["remark"] = "说明";/*多余字段,不会数据导出*/
dtData.Rows.Add(dr);
/*设置导出格式*/
ColumnCollection colModel = new ColumnCollection();
colModel.Add("account", "账户");
colModel.Add("realname", "姓名");
colModel.Add("birthday", "出生日期", typeof(DateTime), "yyyy年MM月dd日");
colModel.Add("price", "保留两位",typeof(double), "#0.00");
colModel.Add("percent", "百分比", typeof(double), "0.00%");
colModel.Add(new ColumnModel() { Name = "money", Desc = "货币格式", Type = typeof(double), Format = "¥#,##0", TextAlign = ColumnAlign.Right });
colModel.Add("gender", "性别", new DataOptions("0:女,1:男".Split(',')));
colModel.Add(new ColumnModel[]
{
new ColumnModel() { Name = "enabled", Desc = "是否启用", Options = new DataOptions("0:否,1:是".Split(',')), TextAlign = ColumnAlign.Center }
}); Console.WriteLine("保存Excel...");
//调用导出方法
NPOIHelper.SaveToExcel(dtData,colModel, "用户信息.xls");
Console.WriteLine("Excel保存成功!");
}
catch (Exception ex)
{
Console.WriteLine("导出异常:" + ex.Message);
}

  运行效果:

  3、当我们使用普通的设置数据列格式,还不能满足要求时,此时,只能采用预定的Excel模板,使用数据填充方式,生成Excel文件?

var fileName = "根据模板生成Excel.xlsx";
try
{
var templateFile = "templateFile.xlsx";
System.IO.File.WriteAllBytes(templateFile, ConsoleApp.Properties.Resources.template); List<TemplateModel> list = new List<TemplateModel>();
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "账号" });
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "名称" });
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "2000-09-01" });
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "备注" }); list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "账号" });
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "名称" });
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "2000-09-01" });
list.Add(new TemplateModel() { RowIndex = , ColIndex = , Value = "备注" });
Console.WriteLine("根据模板生成Excel...");
NPOIHelper.SaveToExcel(templateFile,"sheet1", list, fileName);
Console.WriteLine("Excel保存成功!");
}
catch (Exception ex)
{
Console.WriteLine("生成异常:" + ex.Message);
}

  定义的模板:

  

运行效果:

  

  4、生成Excel文件方法介绍完毕,下面我们看下怎么读取Excel文件内容,我们以直接读取模板生成的Excel文件为例?

try
{ Console.WriteLine("读取Excel内容...");
DataTable dtData = NPOIHelper.ReadToTable(fileName);
StringBuilder fileContent = new StringBuilder();
//标题
foreach (DataColumn dc in dtData.Columns)
{
fileContent.Append(dc.ColumnName + "\t");
}
fileContent.AppendLine(); foreach (DataRow dr in dtData.Rows)
{
foreach (DataColumn dc in dtData.Columns)
{
if (dr[dc.ColumnName] == DBNull.Value)
fileContent.Append("\t");
else
fileContent.Append(dr[dc.ColumnName].ToString() + "\t");
}
fileContent.AppendLine();
}
Console.WriteLine("文件内容:");
Console.WriteLine(fileContent.ToString());
}
catch (Exception ex)
{
Console.WriteLine("生成异常:" + ex.Message);
}

  运行效果:

  
  

至此 ShiQuan.Offices Excel文件读、写操作项目介绍分享完毕,欲听更多精彩,且听下回分解!

基于.net EF6 MVC5+WEB Api 的Web系统框架总结(4)-Excel文件读、写操作的更多相关文章

  1. http服务 WCF、Web API、Web service、WCF REST之间的区别

      http服务 WCF.Web API.Web service.WCF REST之间的区别 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web ...

  2. .net mvc web api Autofac依赖注入框架-戈多编程

    今天自己搭了一套基于三层的依赖注入mvc web api 的依赖注入框架,在此总结下相关配置 1.设置应用程序的.net Framework版本为 4.5 2.通过Nuget 安装autofac包 I ...

  3. NET Web API和Web API Client Gen使Angular 2应用程序

    使用ASP.NET Web API和Web API Client Gen使Angular 2应用程序的开发更加高效 本文介绍“ 为ASP.NET Web API生成TypeScript客户端API ” ...

  4. Web API和Web Service

    首先,Web API是由Web Service演变而来,它们两者关系就是所有Web Service都是API,但并非所有API都是Web Service.其次,两者都有利于信息的传输,但Web API ...

  5. Web APi之Web Host消息处理管道(六)

    前言 我们知道Web API本身是无法提供请求-响应的机制,它是通过Web Host以及Self Host的寄宿的宿主方式来提供一个请求-响应的运行环境.二者都是将请求和响应抽象成HttpRespon ...

  6. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  7. ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

      ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...

  8. 基于.net EF6 MVC5+WEB Api 的Web系统框架总结(1)-Web前端页面

    本 Web 系统框架基于C# EF6+MVC+WebApi的快速应用开发平台.本节主要介绍Web前端页面设计与实现.Web前端页面主要分为普通列表页面.树状导航列表页面.普通编辑页面.数据导入页面.向 ...

  9. 基于.net EF6 MVC5+WEB Api 的Web系统框架总结(2)-业务项目搭建

    本节将介绍如何进行业务项目搭建. 本业务项目示例是简单的企业信息管理功能,业务项目采用Code First方式,搭建包括: 创建实体项目 创建实体数据表映射 创建业务处理项目 创建业务Web项目 搭建 ...

随机推荐

  1. JS高阶---显式原型和隐式原型

    前言: 1.函数对象即函数的prototype原型属性指向原型对象,在创建函数时便存在,默认为空Object 2.实例对象的__proto__隐式原型在实例化创建实例时产生,值等于构造函数的显式pro ...

  2. JS中的实例方法、静态方法、实例属性、静态属性

    一.静态方法与实例方法的例子: 我们先来看一个例子来看一下JS中的静态方法和实例方法到底是什么? 静态方法: function A(){} A.col='red'  //静态属性 A.sayMeS=f ...

  3. 树莓派搭建SVN服务器

    1.安装SVN服务器 sudo apt-get install subversion -y 2.创建仓库 mkdir /home/pi/svnRepository svnadmin create /h ...

  4. SQLAlchemy(3)

    一. SQLAlchemy 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使 ...

  5. 201871010110-李华《面向对象程序设计(java)》第十五周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  6. VirtualBox + vagrant 使用虚拟机

    1.VirtualBox下载地址 https://www.virtualbox.org/wiki/Downloads 2.vagrant下载地址 https://www.vagrantup.com/d ...

  7. day4_变量和作用域

    全局变量与局部变量: 全局变量: 定义变量时,变量左边没有缩进,就是全局变量,可以被当前py文件的任何地方给引用 局部变量: 有缩进的变量就是局部变量 函数的作用域: def test1(): age ...

  8. 《Ensemble Methods: Foundations and Algorithms》

    <Ensemble Methods: Foundations and Algorithms>

  9. 启动hadoop后jps没有namenode,并且启动报错9000

    启动hadoop报错: 解决方法: 我发现没有9000端口被占用,也不知道9000到哪去了,但是也没有NameNode,于是,直接把NameNode格式化了,再重启HDFS即可. 格式化命令:

  10. JavaScript中的回调函数(callback)

    什么是回调函数 In computer programming, a callback is a piece of executable code that is passed as an argum ...