MVC EF EasyUI mysql_ASP.NET MVC5+EF6+EasyUI 后台管理系统

本文示例代码下载: 链接:http://pan.baidu.com/s/1jHBdgCA 密码:hzh7

ps:Vs数据库脚本在解压目录下,修改web.config数据库链接,示例代码包含:导入,导出,上传

前言:

导入导出实在多例子,很多成熟的组建都分装了导入和导出,这一节演示利用LinqToExcel组件对Excel的导入,这个是一个极其简单的例子。

我并不是说导入的简单。而是LinqToExcel让我们对Excel操作更加简单!

最后我们将利用ClosedXML输出Excel。这个比现流行NPOI与EPPlus更加优秀的组件,以Open XML SDK为基础,所以只支持xlsx,不支持xls格式(现阶段谁没有个office2007以上版本)

他导出的Excel根据官方描述,兼容性远超同行对手

如果你不是使用本架构只看2,3,4点,使用BLL层的代码,这同样适用你的MVC程序

知识点:

LinqToExcel组件读取Excel文件

ClosedXML组件输出Excel

准备:

一张演示的数据库表

安装LinqToExcel NuGet包

文件上传样例

CloseXML导出Excel

开始:

1.数据表

124248364_1_20180208064417206.gif

CREATE TABLE [dbo].[Spl_Person]([Id] [nvarchar](50) NOT NULL, --ID

[Name] [nvarchar](50) NULL, --姓名

[Sex] [nchar](10) NULL, --性别

[Age] [int] NULL, --年龄

[IDCard] [nvarchar](50) NULL, --IDCard

[Phone] [nvarchar](50) NULL, --电话

[Email] [nvarchar](200) NULL, --邮件

[Address] [nvarchar](300) NULL, --地址

[CreateTime] [datetime] NOT NULL, --创建时间

[Region] [nvarchar](50) NULL, --区域

[Category] [nvarchar](50) NULL, --类别

CONSTRAINT [PK_Spl_Person] PRIMARY KEY CLUSTERED([Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])ON [PRIMARY]

GO

124248364_1_20180208064417206.gif

按照之前的做法,更新到EF。并利用T4生成DAL,BLL,MODEL。再用代码生成器生成界面复制进解决方案,一步到位

配置好访问地址和权限,直接运行

124248364_2_20180208064417300.png

再手动在工具栏添加导入和导出的按钮(别忘记添加权限)

124248364_3_20180208064417628.png

@Html.ToolButton("btnImport", "fa fa-level-down", Resource.Import, perm, "Import", true)@Html.ToolButton("btnExport", "fa fa-level-up", Resource.Export, perm, "Export", true)

2.安装LinqToExcel包

因为我们读取Excel放在BLL层,所有在BLL层安装LinqToExcel包

124248364_4_20180208064417972.png

3.文件上传

(这一点简单带过,可以到网上下载上传代码植入到自己系统中)

或者或者下载本节的示例代码都可以

我这里使用普通的form上传功能

添加导入前端代码

124248364_1_20180208064417206.gif

Excel:

@Resource.Browse

@Resource.Uploading

124248364_1_20180208064417206.gif

导入按钮事件只要弹出上传框就好

$("#btnImport").click(function () {

$("#uploadExcel").window({ title: '@Resource.Import', width: 450, height: 160, iconCls: 'icon-details' }).window('open');

});

保证上传是成功的。

124248364_5_20180208064418222.png

直接查看源码的C#上传代码

-------------------------------------------------------------------------------------------------------上面只是前期的准备工作--------------------------------------------------------------

在业务层添加以下代码

124248364_6_20180208064418503.gif BLL

124248364_6_20180208064418503.gif ValidationError

代码包含两个方法

public bool CheckImportData( string fileName, List personList,ValidationErrors errors )

fileName为我们上传的文件。

personList为承接数据List

ValidationErrors 错误集合

public void SaveImportData(IEnumerable personList)

保存数据

别忘记添加接口

public partial interfaceISpl_PersonBLL

{bool CheckImportData(string fileName, List personList, refValidationErrors errors);void SaveImportData(IEnumerablepersonList);

}

简单明白,直接看代码,不再解析。OK这样控制器就可以直接调用了

124248364_1_20180208064417206.gif

public ActionResult Import(stringfilePath)

{var personList = new List();//校验数据is

bool checkResult = m_BLL.CheckImportData(filePath, personList, referrors);//校验通过直接保存

if(checkResult)

{

m_BLL.SaveImportData(personList);

LogHandler.WriteServiceLog(GetUserId(),"导入成功", "成功", "导入", "Spl_Person");return Json(JsonHandler.CreateMessage(1, Resource.InsertSucceed));

}else{string ErrorCol =errors.Error;

LogHandler.WriteServiceLog(GetUserId(), ErrorCol,"失败", "导入", "Spl_Person");return Json(JsonHandler.CreateMessage(0, Resource.InsertFail +ErrorCol));

}

}

124248364_1_20180208064417206.gif

最后前端还需要把路径给回来。

124248364_1_20180208064417206.gif

function ImportData()

{

$.post("@Url.Action("Import")?filePath=" + $("#txtExcelPath").val(), function (data) {if (data.type == 1) {

$("#List").datagrid('load');

$('#uploadExcel').window('close');

}

$.messageBox5s('@Resource.Tip', data.message);

},"json");

}

124248364_1_20180208064417206.gif

OK测试一下!建立一个新的excel格式

124248364_7_20180208064418613.png

一般情况下我们是提供模版给用户下载供用户输入数据,来确保格式的正确性

124248364_8_20180208064418910.png

--------------------------------------------------------------------------------------导出功能------------------------------------------------------------------------------

4.安装ClosedXML NuGet包

124248364_9_20180208064419456.png

在控制器添加以下代码:

124248364_1_20180208064417206.gif

publicActionResult Export()

{var exportSpource = this.GetExportData();var dt = JsonConvert.DeserializeObject(exportSpource.ToString());var exportFileName = string.Concat("Person",

DateTime.Now.ToString("yyyyMMddHHmmss"),".xlsx");return newExportExcelResult

{

SheetName= "人员列表",

FileName=exportFileName,

ExportData=dt

};

}privateJArray GetExportData()

{

List list = m_BLL.GetList(ref setNoPagerAscById, "");

JArray jObjects= newJArray();foreach (var item inlist)

{var jo = newJObject();

jo.Add("Id", item.Id);

jo.Add("Name", item.Name);

jo.Add("Sex", item.Sex);

jo.Add("Age", item.Age);

jo.Add("IDCard", item.IDCard);

jo.Add("Phone", item.Phone);

jo.Add("Email", item.Email);

jo.Add("Address", item.Address);

jo.Add("CreateTime", item.CreateTime);

jo.Add("Region", item.Region);

jo.Add("Category", item.Category);

jObjects.Add(jo);

}returnjObjects;

}

124248364_1_20180208064417206.gif

注意:ExportExcelResult

此类是使用ClosedXML.Excel,已经封装好了。大家直接拿来用就可以。把关注点都放在业务中

124248364_1_20180208064417206.gif

usingClosedXML.Excel;usingSystem;usingSystem.Data;usingSystem.IO;usingSystem.Text;usingSystem.Web;usingSystem.Web.Mvc;namespaceApps.Web.Core

{public classExportExcelResult : ActionResult

{public string SheetName { get; set; }public string FileName { get; set; }public DataTable ExportData { get; set; }publicExportExcelResult()

{

}public override voidExecuteResult(ControllerContext context)

{if (ExportData == null)

{throw new InvalidDataException("ExportData");

}if (string.IsNullOrWhiteSpace(this.SheetName))

{this.SheetName = "Sheet1";

}if (string.IsNullOrWhiteSpace(this.FileName))

{this.FileName = string.Concat("ExportData_",

DateTime.Now.ToString("yyyyMMddHHmmss"),".xlsx");

}this.ExportExcelEventHandler(context);

}///

///Exports the excel event handler.///

/// The context.

private voidExportExcelEventHandler(ControllerContext context)

{try{var workbook = newXLWorkbook();if (this.ExportData != null)

{

context.HttpContext.Response.Clear();//编码

context.HttpContext.Response.ContentEncoding =Encoding.UTF8;//设置网页ContentType

context.HttpContext.Response.ContentType =

"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";//导出名字

var browser =context.HttpContext.Request.Browser.Browser;var exportFileName = browser.Equals("Firefox", StringComparison.OrdinalIgnoreCase)? this.FileName

: HttpUtility.UrlEncode(this.FileName, Encoding.UTF8);

context.HttpContext.Response.AddHeader("Content-Disposition",string.Format("attachment;filename={0}", exportFileName));//Add all DataTables in the DataSet as a worksheets

workbook.Worksheets.Add(this.ExportData, this.SheetName);using (var memoryStream = newMemoryStream())

{

workbook.SaveAs(memoryStream);

memoryStream.WriteTo(context.HttpContext.Response.OutputStream);

memoryStream.Close();

}

}

workbook.Dispose();

}catch(Exception ex)

{throw;

}

}

}

}

124248364_1_20180208064417206.gif

总结:

本节知识点,全部聚集在CheckImportData方法上。

对应列头是模版xlsx的列头

124248364_10_20180208064420285.png

1.如果模版需要是是中文的,如Name=名字,那么方法应该这么写

excelFile.AddMapping(x => x.Name, "名字");

2.导入第几个sheet工作薄可以这么写

我这里写0是指第一个sheet工作薄。可以直接指定工作薄

var excelContent = excelFile.Worksheet("Sheet1");

3.检查正确性可以确保数据的来源。可以给出用户正确的修改提示。

4.借助ClosedXML,导出实际只需要几行代码。哈哈..这是如此的简单。

124248364_1_20180208064417206.gif

return newExportExcelResult

{

SheetName= "人员列表",

FileName=exportFileName,

ExportData=dt

};

124248364_1_20180208064417206.gif

124248364_11_20180208064420378.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值