在做系统的时候,很多时候信息量太大,这时候就需要进行Excel表格信息的导入和导出,今天就来给大家说一下我使用Excel表格信息导入和导出的心得。

1:首先需要在前端显示界面View视图中添加导入Excel和导出Excel按钮:

<div class="btn-group">
<button type="button" class="btn btn-success">
<i class="fa fa-download"></i>
@T("导出")
</button>
<button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">&nbsp;</span>
</button> @* 导出全部的form提交 *@
<ul class="dropdown-menu" role="menu">
<li class="divider"></li>
<form action="/控制器/ExportExcelAll"
method="post">
<li>
<button type="submit" name="exportexcel-all">
<i class="fa fa-file-excel-o"></i>
@T("导出到Excel(全部)")
</button>
</li>
</form>
<li>
<button type="button" id="exportexcel-selected">
<i class="fa fa-file-excel-o"></i>
@T("导出到Excel(所选)")
</button>
</li>
</ul>
</div>
<button type="button" name="importexcel" class="btn bg-olive" data-toggle="modal" data-target="#importexcel-window">
<i class="fa fa-upload"></i>
@T("导入")
</button>

这里注意,导出(所选)Excel是通过获取当下的表单的方式来导出数据的,导出是通过提交form表单实现的(原因为通过submit没有响应)

2:添加点击事件后弹出来的操作界面(importexcel-window):通过 data 属性:在按钮上设置属性 data-toggle="modal",同时设置 data-target="#identifier" 或 href="#identifier" 来指定要切换的特定的模态框(带有 id="identifier")。通过 JavaScript:使用这种技术,您可以通过简单的一行 JavaScript 来调用带有 id="identifier" 的模态框:

$('#identifier').modal(options)
@*import GradeMessage form*@
<div id="importexcel-window" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="importexcel-window-title">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="importexcel-window-title">@T("Admin.Common.ImportFromExcel")</h4>
</div>
@using (Html.BeginForm("ImportExcel", "GradeMessage", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-horizontal">
<div class="modal-body">
@Html.AntiForgeryToken() <div class="form-group">
<div class="col-md-2">
<div class="label-wrapper">
<label class="control-label">
@T("Admin.Common.ExcelFile")
</label>
</div>
</div>
<div class="col-md-10">
<input type="file" id="importexcelfile" name="importexcelfile" class="form-control" />
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">
@T("Admin.Common.ImportFromExcel")
</button>
</div>
</div>
}
</div>
</div>
</div>

3.在控制器端添加导入Excel和导出Excel方法:

(1)导入Excel:

        public ActionResult ImportExcel()
{ try
{
var file = Request.Files["importexcelfile"];
if (file != null && file.ContentLength > )
{
_importManager.ImportGradeMessageFromXlsx(file.InputStream);
}
else
{
ErrorNotification(_localizationService.GetResource("Admin.Common.UploadFile"));
return RedirectToAction("List");
}
SuccessNotification(_localizationService.GetResource("导入成功"));
return RedirectToAction("List");
}
catch (Exception exc)
{
ErrorNotification(exc);
return RedirectToAction("List");
}
}

这里面

_importManager.ImportGradeMessageFromXlsx(file.InputStream)

中_importManager是实例化接口并调用接口中的方法ImportFamiliesFromXlsx()

添加成员变量_importManager:private readonly IImportManager _importManager;

接口IImportManager :

public partial interface IImportManager
{
/// <summary>
/// Import products from XLSX file
/// </summary>
/// <param name="stream">Stream</param>
void ImportGradeMessageFromXlsx(Stream stream);
}

接口方法的实现:

 public void ImportGradeMessageFromXlsx(Stream stream)
{
{ using (var xlPackage = new ExcelPackage(stream))
{ //得到第一个表的工作簿
var worksheet = xlPackage.Workbook.Worksheets.FirstOrDefault();
if (worksheet == null)
throw new NopException("No worksheet found");
//列的属性
var properties = new[]
{
"参赛者姓名", };
int iRow = ;//行
while (true)
{
bool allColumnsAreEmpty = true;
if (worksheet.Cells[iRow, ].Value != null && !String.IsNullOrEmpty(worksheet.Cells[iRow, ].Value.ToString()))
{
allColumnsAreEmpty = false;
}
if (allColumnsAreEmpty)
break; string CompetitorName = ConvertColumnToString(worksheet.Cells[iRow, GetColumnIndex(properties, "参赛者姓名")].Value); string EventName = ConvertColumnToString(worksheet.Cells[iRow, GetColumnIndex(properties, "赛事信息")].Value);//外键对应的名称 var gradeMessage = _gradeMessageService.GetAllGradeMessages().FirstOrDefault(f => f.CompetitorDocumentNumber == CompetitorDocumentNumber);//通过证件好查询所用的信息
bool newGradeMessage = false;
if (gradeMessage == null)
{
gradeMessage = new GradeMessage();
newGradeMessage = true;
}
gradeMessage.CompetitorName = CompetitorName;//此处在进行相应的属性值最好与之前设置列属性的顺序一致,并采用相同的英文名称 gradeMessage.GradeReleaseTime = DateTime.ParseExact(GradeReleaseTime, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture);//将string转成DateTime gradeMessage.GradeJudge = GradeJudge;
gradeMessage.EventId = _eventSystemMessageService.GetAllEventSystemMessages().FirstOrDefault(x => x.EventName == EventName).Id;//通过外键表的名称并查询处外键Id
if (newGradeMessage)
{
_gradeMessageService.InsertGradeMessage(gradeMessage);
}
else
{
_gradeMessageService.UpdateGradeMessage(gradeMessage);
}
//next gradeMessage
iRow++;
}
}
}
}

这样就可以通过Excel表格数据进行数据的导入了

注意:对于”可为空“的导入时需要判断(if-else)否则会出现”未将对象设置到对象实例“错误:例如

if (_groupRegistratorMessageService.GetAllGroupRegistratorMessages().FirstOrDefault(x => x.GroupName == GroupName)!=null)
{
registratorMessage.GroupId = _groupRegistratorMessageService.GetAllGroupRegistratorMessages().FirstOrDefault(x => x.GroupName == GroupName).Id;
}
else
{
registratorMessage.GroupId = null;
}

(2)将数据导出到Excel表格:

进行导出时与进行导入时的步骤大庭相径,不同的是一些接口的调用

(2.1)导出全部

  [HttpPost, ActionName("List")]

        [FormValueRequired("exportexcel-all")]
public ActionResult ExportExcelAll()
{
var gradeMessages = _gradeMessageService.GetAllGradeMessages().ToList();
try
{
var bytes = _exportManager.ExportGradeMessagesToXlsx(gradeMessages); return File(bytes, MimeTypes.TextXlsx, "gradeMessages.xlsx");
}
catch (Exception exc)
{
ErrorNotification(exc);
return RedirectToAction("List");
}
}

同样的这里面的

_exportManager.ExportGradeMessagesToXlsx(gradeMessages)

是实现导出Excel方法的接口并调用方法ExportFamiliesToXlsx()

添加成员变量_exportManager:private readonly IExportManager _exportManager;

IExportManager 接口:

public partial interface IExportManager
{
/// <summary>
/// Export GradeMessage list to XLSX
/// </summary>
/// <param name="stream">Stream</param>
/// <param name="families">Customers</param>
byte[] ExportGradeMessagesToXlsx(IEnumerable<GradeMessage> GradeMessages);;//这里的GradeMessage是对应数据库的类
}

IExportManager 接口实现:

 public byte[] ExportGradeMessagesToXlsx(IEnumerable<GradeMessage> GradeMessages)
{
var properties = new[]
{
new PropertyByName<GradeMessage>("参赛者姓名", p => p.CompetitorName),
new PropertyByName<GradeMessage>("赛事信息", p=>GetGradeNameById(p.EventId)),//注意这里是不允许多层查询的只好通过自定义方法来传参查询 };
return ExportToXlsx(properties, GradeMessages);
} /// <summary>
/// 获取赛事系统名称(通过id找到名称)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private string GetGradeNameById(int id)
{
return _eventSystemMessageService.GetEventSystemMessageById(id).EventName;
}

这样就可以完成功能了。

(2.2)导出(所选)

控制器中的方法:

     [HttpPost]
public ActionResult ExportExcelSelected(string selectedIds)
{ var gradeMessages = new List<GradeMessage>();
if (selectedIds != null)
{
var ids = selectedIds
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => Convert.ToInt32(x))
.ToArray();
gradeMessages.AddRange(_gradeMessageService.GetGradeMessagesByIdCollection(ids));
} try
{
byte[] bytes = _exportManager.ExportGradeMessagesToXlsx(gradeMessages);
return File(bytes, MimeTypes.TextXlsx, "gradeMessages.xlsx");
}
catch (Exception exc)
{
ErrorNotification(exc);
return RedirectToAction("List");
}
}

注意,这里是导出接口和实现方法和导出全部的一样。

视图端通过点击事件请求数据

@using (Html.BeginForm("ExportExcelSelected", "GradeMessage", FormMethod.Post, new { id = "export-excel-selected-form" }))
{
@Html.AntiForgeryToken()
<input type="hidden" id="selectedIds" name="selectedIds" value="" />
}
<script type="text/javascript">
$(document).ready(function () {
$('#exportexcel-selected').click(function (e) {
e.preventDefault();
var ids = selectedIds.join(",");
$('#export-excel-selected-form #selectedIds').val(ids);
$('#export-excel-selected-form').submit();
return false;
});
});
</script>

这样就完成导入导出来。

Excel导入-----导出(包含所选和全部)操作的更多相关文章

  1. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

  2. 关于Excel导入导出的用例设计

    目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...

  3. 土制Excel导入导出及相关问题探讨

    转载请注明出处https://www.cnblogs.com/funnyzpc/p/10392085.html 新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗: < ...

  4. java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)

    最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...

  5. Java之POI的excel导入导出

    一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...

  6. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  7. excel 导入导出测试点

    目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...

  8. 如何自动化你的Excel导入导出(Java)?

    GitHub | 中文 | English | 博客 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择用Apache P ...

  9. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

随机推荐

  1. Parquet与ORC:高性能列式存储格式(收藏)

    背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌 ...

  2. 我在使用vs进行C#编程中常用的几个快捷键

    在vs中进行C#编程时: (1)输入svm然后按Tab键会生成Main函数: (2)Ctrl +k+s 三个键一起按,会调出代码段:选中多行后,然后按以上三个快捷键,输入需要使用的代码段,按下Tab, ...

  3. jQuery实现瀑布流

    瀑布流布局多用于加载图片,或者图片配上文字.视觉表现为参差不齐的多栏布局.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部.本文就来利用jQuery实现一个图片瀑布流的效果. 1.布局. 首 ...

  4. php生成json或者xml数据

    , ,'数据返回成功',$arr);echo $xml;?>

  5. [ASP.NET]

    public static int iA; protected void Button1_Click(object sender, EventArgs e) { //Label1.Text Respo ...

  6. UVa 1354 天平难题 Mobile Computing

    整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 考虑不要重复计算,有一个vis 数组 预处理可以先计算出一棵树的重量,简化计 ...

  7. yum源使用(转)

    一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...

  8. oracle 返回第一个不为空的列的值

    ) from emp; 作用是返回函数coalesce参数中第一个不为null的值.

  9. jshint创建配置文件

    在项目中创建文件,并必须以 .jshintrc 命名: 例如 {    "eqeqeq":true,     "curly":true}

  10. linux查看系统类型和版本

    首先大致普及下linux系统的版本内容. 1.内核版本和发行版本区别 我的理解,内核版本就是指linux中最基层的代码,版本号如 Linux version 3.10.0-327.22.2.el7.x ...