//导入数据
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 = 4000 * 1024;//定义上传文件的最大空间大小为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(0);
IEnumerator rows = workSheet.GetRowEnumerator();
rows.MoveNext();
HSSFRow row = (HSSFRow)rows.Current;
for (int i = 0; i < workSheet.GetRow(0).LastCellNum; i++)
{
dt.Columns.Add(row.GetCell(i).StringCellValue);
}
while (rows.MoveNext())
{
row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; 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 = 1;
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 = 60000;
var count = list.Count / size;
if (list.Count%size != 0)
{
count += 1;
}
workBook = new HSSFWorkbook();
ms = new MemoryStream();
fileName = fileName == "" ? "导出Excel" : fileName;
//fileName不能包含 : / \ ? * [ ]等特殊字符
for (int a = 0; a < count; a++)
{
#region 创建sheet

workSheet = workBook.CreateSheet(fileName+(a+1));

DataTable dt = new DataTable();
if (dicProperties.Count > 0 && list.Count > 0)
{
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 = 0;
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 = 0;

rowExcel = workSheet.CreateRow(rowIndex);
int intColumn = 0;

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 = 0;
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 = 0;
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;
}