在做系统的时候,很多时候信息量太大,这时候就需要进行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. c#中实现多个接口出现同名同参的方法

    IDictionary接口类同时继承了 IEnumerable<KeyValuePair<TKey, TValue>> 和 IEnumerable这两个接口 public in ...

  2. 使用WebClient 或者 HttpWebRequest均报:"The Remote name can't be solved"

    错误原因: 未配置代理服务器设置的问题, 需要在配置节做如下操作. ============================================ 文章编号: 318140 - 查看本文应用 ...

  3. sql server之数据库语句优化

    三.只返回需要的数据 返回数据到客户端至少需要数据库提取数据.网络传输数据.客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器.网络和客户端的无效劳动,其害处是显而易见的,避 ...

  4. Java面试宝典答案详解与感悟(第一天)

    一.Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java&quo ...

  5. ECharts-基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表

    ECharts http://ecomfe.github.com/echarts 基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算 ...

  6. 写出易调试的SQL—西科软件

    1.前言 上篇 写出易调试的SQL , 带来了一些讨论, 暴露了不能重用执行计划和sql注入问题, 十分感谢园友们的建议 . 经过调整后 ,将原来的SQLHelper 抓SQL 用做调试环境用, 发布 ...

  7. js escape

    JS转义 escape().encodeURI().encodeURIComponent()区别详解 JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,e ...

  8. Java基础---MD5和BASE64

    package cn.peter; import sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException; import ...

  9. mybatis多表连接在一起查询

    实体类 和 xml (这里用了几个典型的数据类型,都是其他表的字段) private String marriage;//图片 remarks private Date createtime;//公告 ...

  10. SpringMVC保存数据到mysql乱码问题

    SpringMVC保存数据到mysql乱码问题 乱码问题常见配置 一.web.xml配置过滤器 <filter> <filter-name>encoding-filter< ...