您的位置:首页 > 理论基础 > 计算机网络

已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

2016-06-27 08:58 591 查看

文章由于写得比较仓促

已经重写,源码和文章请跳转

http://www.cnblogs.com/ymnets/p/5621706.html

系列目录

前言:

导入导出实在多例子,很多成熟的组建都分装了导入和导出,这一节演示利用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包

文件上传样例

(时间关系只能在下一节)

开始:

1.数据表

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


如何使用这个框架?

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

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

public class ValidationErrors : List<ValidationError>
{
/// <summary>
/// 添加错误
/// </summary>
/// <param name="errorMessage">信息描述</param>
public void Add(string errorMessage)
{
base.Add(new ValidationError { ErrorMessage = errorMessage });
}
/// <summary>
/// 获取错误集合
/// </summary>
public string Error
{
get {
string error = "";
this.All(a => {
error += a.ErrorMessage;
return true;
});
return error;
}
}
}


ValidationError
代码包含两个方法

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

fileName为我们上传的文件。

personList为承接数据List

ValidationErrors 错误集合

public void SaveImportData(IEnumerable<Spl_PersonModel> personList)

保存数据

别忘记添加接口

public partial interface ISpl_PersonBLL
{
bool CheckImportData(string fileName, List<Spl_PersonModel> personList, ref ValidationErrors errors);
void SaveImportData(IEnumerable<Spl_PersonModel> personList);
}


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

public ActionResult Import(string filePath)
{
var personList = new List<Spl_PersonModel>();
//校验数据is
bool checkResult = m_BLL.CheckImportData(filePath, personList, ref errors);
//校验通过直接保存
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));
}

}


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

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");
}


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



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



总结:

虽然做好了导出功能,但是来不及发代码。只能到下次有时间再分析导出功能

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

对应列头是模版xlsx的列头



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

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

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

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

var excelContent = excelFile.Worksheet<Spl_PersonModel>("Sheet1");

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: