Excel导入导出,通过datatable转存(篇一)
//导入数据
public ActionResult ExpressInfoImport()
{
var ptcp = new BaseResponse() { DoFlag = true, DoResult = "Success" };
var file = Request.Files["files"];
if (file == null)
{
ptcp.DoFlag = false;
ptcp.DoResult = "请选择上传文件";
goto ovr;
}
try
{
var filename = Path.GetFileName(file.FileName);
if (string.IsNullOrEmpty(filename))
{
ptcp.DoFlag = false;
ptcp.DoResult = "请选择上传文件"; goto ovr; }
var filesize = file.ContentLength;//获取上传文件的大小单位为字节byte
var fileEx = Path.GetExtension(filename);//获取上传文件的扩展名
var noFileName = Path.GetFileNameWithoutExtension(filename);//获取无扩展名的文件名
var maxSize = * ;//定义上传文件的最大空间大小为4M
var fileType = ".xls,.xlsx";//定义上传文件的类型字符串 var fileName = noFileName + "_" + System.Guid.NewGuid() + fileEx;
if (!fileType.Contains(fileEx))
{
ptcp.DoFlag = false;
ptcp.DoResult = "文件类型不对,只能导入xls和xlsx格式的文件"; goto ovr;
}
if (filesize >= maxSize)
{
ptcp.DoFlag = false;
ptcp.DoResult = "上传文件超过4M,不能上传"; goto ovr;
}
var url = Configurator.JsonServiceUrl("UploadFile");
if (!Directory.Exists(url))//如果不存在就创建file文件夹
{
Directory.CreateDirectory(url);
}
var virtualPath = string.Format("{0}{1}", url, fileName);
// 文件系统不能使用虚拟路径
file.SaveAs(virtualPath); //读取文件内容,循环处理
var stream = new FileStream(virtualPath, FileMode.Open);
var dataTable = ExcelHelper.GetInstance().ReadExcelToDataTable(stream);
var list = new List<ExpressImportModel>();
try
{
foreach (DataRow dr in dataTable.Rows)
{
var sysNo = dr["SysNo"];
var orderCode = dr["订单号"];
var logiscticNo = dr["物流单号"];
var sugges = dr["处理建议"];
list.Add(new ExpressImportModel()
{
SysNo = Convert.ToInt32(sysNo),
OrderCode = orderCode.ToString(),
LogiscticNo = logiscticNo.ToString(),
Suggest = sugges.ToString()
});
}
}
catch (Exception e)
{
ptcp.DoFlag = false;
ptcp.DoResult = "导入格式不正确:e" + e.Message; goto ovr;
}
if (!list.Any())
{
ptcp.DoFlag = false;
ptcp.DoResult = "导入内容为空"; goto ovr;
} var response = ExpressClient.Instance.ImportHandleInfo(list);
ptcp.DoFlag = response.DoFlag;
ptcp.DoResult = response.DoResult;
if (response.ErrDtos.Any())
{
var errStr = new StringBuilder();
foreach (var item in response.ErrDtos)
{
errStr.AppendFormat(@"SysNo_{0}_OrderCode{1}_LogiscticNo{2}导入错误:{3} <br/>", item.SysNo,
item.OrderCode, item.LogiscticNo, item.ErrReason);
}
ptcp.DoResult = "以下导入出现错误:<br/>" + errStr.ToString();
}
}
catch (Exception ex)
{
ptcp.DoFlag = false;
ptcp.DoResult = ex.ToString();
} ovr:
ViewBag.Result = ptcp;
return View("Export/Export");
}
/// <summary>
/// 读取Excel文件转化为DataTable
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public DataTable ReadExcelToDataTable(Stream stream)
{
DataTable dt = new DataTable();
workBook = new HSSFWorkbook(stream);
workSheet = workBook.GetSheetAt();
IEnumerator rows = workSheet.GetRowEnumerator();
rows.MoveNext();
HSSFRow row = (HSSFRow)rows.Current;
for (int i = ; i < workSheet.GetRow().LastCellNum; i++)
{
dt.Columns.Add(row.GetCell(i).StringCellValue);
}
while (rows.MoveNext())
{
row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = ; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell != null)
{
dr[i] = cell.ToString();
}
else
{
dr[i] = null;
}
}
dt.Rows.Add(dr);
}
return dt;
}
导出:
[HttpPost]
[MultipleButton(Name = "action", Argument = "ExpressInfoExport")]
public ActionResult ExpressInfoExport(ExpressInfoRefer refer)
{
refer.PageIndex = ;
refer.PageSize = int.MaxValue;
var result = ExpressClient.Instance.QueryExpressInfoPageList(refer);
if (result.List == null || !result.List.Any())
{
return View("Error");
}
var dicProperties = new Dictionary<string, string>();
dicProperties.Add("SysNo", "SysNo");
dicProperties.Add("OrderCode", "订单号");
dicProperties.Add("LogiscticNo", "物流单号");
dicProperties.Add("LogiscticId", "配送商ID");
dicProperties.Add("LogiscticCompanyName", "快递公司");
dicProperties.Add("OrderStatusContent", "订单扭转");
dicProperties.Add("LogiscticContent", "物流信息");
dicProperties.Add("LogisticOuterContent", "国际物流");
dicProperties.Add("CallTypeDesc", "对接方式");
dicProperties.Add("SubscribeStatusDesc", "订阅状态");
dicProperties.Add("SubscribeCount", "订阅次数");
dicProperties.Add("CallCount", "总调用(推送)次数");
dicProperties.Add("LastStatusDesc", "运单状态");
dicProperties.Add("PushRequestMessage", "快递100消息");
dicProperties.Add("RequestFaildReason", "订阅失败原因");
dicProperties.Add("OrderTypeDesc", "订单类型");
dicProperties.Add("RowCreateDate", "创建日期");
dicProperties.Add("Remark", "备注");
dicProperties.Add("HandleSuggest", "处理建议"); ExcelHelper.GetInstance().WriteListToExcel(result.List, dicProperties, "物流信息列表");
return null;
}
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; } public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
var isValidName = false;
var keyValue = string.Format("{0}:{1}", Name, Argument);
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue); if (value != null)
{
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
isValidName = true;
} return isValidName;
}
}
/// <summary>
/// 导出Excel
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">数据结果List</param>
/// <param name="dicProperties">以字段-名称的形式</param>
/// <param name="fileName">导出文件名</param>
public void WriteListToExcel<T>(List<T> list, Dictionary<string, string> dicProperties, string fileName) where T : class
{
var size = ;
var count = list.Count / size;
if (list.Count%size != )
{
count += ;
}
workBook = new HSSFWorkbook();
ms = new MemoryStream();
fileName = fileName == "" ? "导出Excel" : fileName;
//fileName不能包含 : / \ ? * [ ]等特殊字符
for (int a = ; a < count; a++)
{
#region 创建sheet workSheet = workBook.CreateSheet(fileName+(a+)); DataTable dt = new DataTable();
if (dicProperties.Count > && list.Count > )
{
Type type = typeof(T);
foreach (KeyValuePair<string, string> property in dicProperties)
{
//建立DataTable表头
dt.Columns.Add(new DataColumn(property.Value));
}
foreach (T t in list.Skip(size*a).Take(size))
{
DataRow dr = dt.NewRow();
int i = ;
foreach (KeyValuePair<string, string> property in dicProperties)
{
PropertyInfo pi = type.GetProperty(property.Key);
object obj = pi.GetValue(t, null);
//为DataTable表内容赋值
dr[i] = obj == null ? "" : obj.ToString();
i++;
}
dt.Rows.Add(dr);
} CreateExcel(dt, dicProperties); }
#endregion
}
WriteToExcel(fileName); }
private void CreateExcel(DataTable dt, Dictionary<string, string> dicProperties)
{
IRow rowExcel;
ICell cellExcel;
int rowIndex = ; rowExcel = workSheet.CreateRow(rowIndex);
int intColumn = ; foreach (KeyValuePair<string, string> dicProperty in dicProperties)
{
cellExcel = rowExcel.CreateCell(intColumn);
cellExcel.SetCellValue(dicProperty.Value);
++intColumn;
} foreach (DataRow row in dt.Rows)
{
++rowIndex;
rowExcel = workSheet.CreateRow(rowIndex);
int intColumnContent = ;
foreach (KeyValuePair<string, string> property in dicProperties)
{
cellExcel = rowExcel.CreateCell(intColumnContent);
cellExcel.SetCellValue(row[property.Value].ToString());
++intColumnContent;
}
}
}
/// <summary>
/// 导出Excel文件
/// </summary>
/// <param name="fileName"></param>
private void WriteToExcel(string fileName)
{
workBook.Write(ms);
ms.Flush();
ms.Position = ;
workBook = null;
HttpContext current = HttpContext.Current;
current.Response.ContentType = "application/ms-excel";
current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls"); current.Response.BinaryWrite(ms.ToArray());
current.Response.End();
ms.Close();
ms = null;
}
Excel导入导出,通过datatable转存(篇一)的更多相关文章
- ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...
- Excel导入导出的业务进化场景及组件化的设计方案(上)
1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...
- Excel导入导出帮助类
/// <summary> /// Excel导入导出帮助类 /// 记得引入 NPOI /// 下载地址 http://npoi.codeplex.com/rele ...
- Mego(04) - NET简单实现EXCEL导入导出
前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...
- JeeSite中Excel导入导出
在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel.CSV格式居多.如果是学习的过程中,最好是自己实现数据导入与导出的功能,然而在项目中,还是调用现成的功能比较好.近期一直使用 ...
- java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)
最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...
- Java Excel 导入导出(一)
本文主要描述通过java实现Excel导入导出 一.读写Excel三种常用方式 1.JXL——Java Excel开放源码项目:读取,创建,更新 2.POI——Apache POI ,提供API给Ja ...
- 利用反射实现通用的excel导入导出
如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...
- 关于Excel导入导出的用例设计
目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
随机推荐
- UDT中的epoll
epoll 是为处理大量句柄而改进的poll,在UDT中也有支持.UDT使用了内核提供的epoll,主要是epoll_create,epoll_wait,epoll_ctl,UDT定义了CEPollD ...
- android-The method findViewById(int) is undefined for the type ContactMainFragment报错
@Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view ...
- python setuptools工具打包
http://blog.csdn.net/five3/article/details/7847551http://blog.csdn.net/reyoung1110/article/details/7 ...
- Redis-benchmark测试Redis性能
Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能. 使用说明如下: Usage: redis-benchmark [-h <host>] ...
- win7 telnet
一.telnet连接 1.linux linux下可以通过net stat 查看22端口来确认端口是否开放. 然后在cmd中可通过telnet 10.0.200.151 22来连接. 2.win7 w ...
- 301重定向.htaccess规则(含二级目录跳转二级域名)
301重定向是一种非常重要的"自动转向"技术.网址重定向最为可行的一种办法.当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码 ...
- label的for属性
一.使用介绍 <label>专为input元素服务,为其定义标记. for属性规定label与哪个表单元素绑定 label和表单控件绑定方式又两种: 1.将表单控件作为label的内容,这 ...
- 最新discuz模版制作7堂课让你精通discuz模版制作
第一课 基本知识储备一.基本 HTML 代码二.网站语言编码 三.DIV+CSS 认知及应用 第二课 必备软件.环境配置及程序安装 第三课 DISCUZ 构架详解 一.DISCUZ 基础构架讲 ...
- 03 Hibernate错题分析
1.在Hibernate中,以下关于主键生成器说法错误的是( C). A.increment可以用于类型为long.short或byte的主键 B.identity用于如SQL Server.DB2. ...
- java分层开发
既然是分层开发,首先我们需要知道的是分为那几个层,并且是干什么的? 1.实体层(entity) 对应数据库中的一张表,有了它可以降低耦合性,同时也是数据的载体. 2.数据访问对象(data acces ...