C# 之 EXCEL导入导出
以下方式是本人总结的一些经验,肯定有很多种方法,在此先记下,留待以后补充...
希望朋友们一起来探讨相关想法,请在下方留言.
A-1:EXCEL模板导出
非常简单,将EXCEL模板上传到项目中后,将其浏览URL保存下来(excelUrl),然后:
window.location.href="http://localhost:10086/yuanxin/Resources/BusRoute.xlsx" //EXCEL浏览路径
或者使用<a href="excelUrl"></a>都行。
A-2:EXCEL数据导出--Web项目--C#代码导出:
/// <summary>
/// EXCEL帮助类
/// </summary>
/// <typeparam name="T">泛型类</typeparam>
/// <typeparam name="TCollection">泛型类集合</typeparam>
public class ExcelHelp<T, TCollection> where T : new() where TCollection : List<T>, new()
{
//http请求Request对象
public static HttpRequest baseRequest = HttpContext.Current.Request;
//http请求Response对象
public static HttpResponse baseResponse = HttpContext.Current.Response;/// <summary>
/// 将数据导出EXCEL
/// </summary>
/// <param name="columnNameAndShowNameDic">列名+显示名</param>
/// <param name="tColl">数据集(tColl里的类属性名必须和字典中的列名一致)</param>
public static void ExportExcelData(Dictionary<string, string> columnNameAndShowNameDic, TCollection tColl)
{
WorkBook workbook = WorkBook.CreateNew();
WorkSheet worksheet = workbook.Sheets["sheet1"];
List<string> columnNameList = columnNameAndShowNameDic.Keys.ToList();
List<string> showNameList = columnNameAndShowNameDic.Values.ToList();
//暂定26行
string[] zm = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
//设置首列显示
for (var i = 0; i < columnNameList.Count; i++)
{
worksheet.Cells[zm[i] + "1"].Value = showNameList[i];
//加粗
worksheet.Cells[zm[i] + "1"].Style.Font.Bold = true;
}
for (int i = 0; i < tColl.Count; i++)
{
for (int j = 0; j < columnNameList.Count; j++)
{
worksheet.Cells[zm[j] + (i + 2)].Value = getPropertyValue(tColl[i], columnNameList[j]);
}
}
byte[] buffer = workbook.SaveAsBytes();
baseResponse.Clear();
baseResponse.Buffer = true;
baseResponse.ContentEncoding = System.Text.Encoding.UTF8;
//baseResponse.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
baseResponse.ContentType = "application/vnd.ms-excel";
//设置导出文件名
baseResponse.AddHeader("content-disposition", "attachment; filename=" + "MaintainReport" + ".xlsx");
baseResponse.AddHeader("Content-Length", buffer.Length.ToString());
baseResponse.BinaryWrite(buffer);
baseResponse.Flush();
baseResponse.End();
}
/// <summary>
/// 获取属性值
/// </summary>
/// <param name="t">T对象实例</param>
/// <param name="propertyName">属性名</param>
/// <returns></returns>
public static string getPropertyValue(T t, string propertyName)
{
PropertyInfo info = t.GetType().GetProperty(propertyName);
//获取属性值转换暂设置如下字段,可根据实际情况添加
if (info.PropertyType == typeof(DateTime))
{
return Convert.ToDateTime(info.GetValue(t)).ToString("yyyy-MM-dd HH:mm");
}
return info.GetValue(t).ToString();
}
}
A-2--EXCEL数据导出--WebAPI项目--NPOI--接口导出:
说明:以下方法借助第三方插件:NPOI专门处理EXCEL等办公文档的类库,因此项目中需引用该插件,NuGet--所有NPOI即可安装。
/// <summary>
/// 班车数据导出成EXCEL
/// </summary>
/// <param name="conferenceID"></param>
/// <returns></returns>
[HttpGet]
public HttpResponseMessage ExportExcelDataForBusRoute(string conferenceID)
{
HttpResponseMessage result = new HttpResponseMessage();
ControllerHelp.RunAction(() =>
{
BusRouteModelCollection busColl = BusRouteModelAdapter.Instance.Load(m => m.AppendItem("ConferenceID", conferenceID));
Dictionary<string, string> dicColl = new Dictionary<string, string>() {
{"路线标题","Title" },
{"发车时间","DepartDate" },
{"出发地","BeginPlace" },
{"对接人","ContactsName" },
{"对接人电话","ContactsPhone" }
};
result = ExcelHelp<BusRouteModel, BusRouteModelCollection>.ExportExcelData(dicColl, busColl, "BusRoute");
});
return result;
}
/// <summary>
/// 得到excel文件流
/// </summary>
/// <returns></returns>
private MemoryStream ExcelStream(Dictionary<string, string> displayAndColumnName, TCollection tlist)
{
//var list = dc.v_bs_dj_bbcdd1.Where(eps).ToList();
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
//1-创建首行
IRow headRow = sheet1.CreateRow(0);
//1.1-设置首行样式
IFont font = workbook.CreateFont();
font.Boldweight = (short)FontBoldWeight.Bold; //字体加粗
ICellStyle headCellStyle = workbook.CreateCellStyle();
headCellStyle.SetFont(font);
headCellStyle.Alignment = HorizontalAlignment.Center; //字体居中
List<string> displayNameList = displayAndColumnName.Keys.ToList();
//1.2-设置首行标题
for (var i = 0; i < displayAndColumnName.Keys.Count; i++)
{
ICell cell = headRow.CreateCell(i);
cell.SetCellValue(displayNameList[i].ToString());
cell.CellStyle = headCellStyle;
}
//2-设置内容列
List<string> columnNameList = displayAndColumnName.Values.ToList();
//2.1-内容行样式
ICellStyle contentCellStyle = workbook.CreateCellStyle();
contentCellStyle.Alignment = HorizontalAlignment.Center; //字体居中
for (var i = 0; i < tlist.Count; i++)
{
IRow row = sheet1.CreateRow(i + 1);
//设置内容
for (var j = 0; j < columnNameList.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue(getPropertyValue(tlist[i], columnNameList[j]));
cell.CellStyle = contentCellStyle;
}
}
//3-自动列宽-根据内容长度自动展开
for (int i = 0; i < displayNameList.Count; i++)
{
sheet1.AutoSizeColumn(i);
}
MemoryStream file = new MemoryStream();
workbook.Write(file);
//这句代码非常重要,如果不加,会报:打开的EXCEL格式与扩展名指定的格式不一致
file.Seek(0, SeekOrigin.Begin);
return file;
}
/// <summary>
/// 导出excel功能控制器
/// </summary>
/// <returns></returns>
public HttpResponseMessage ExportExcelDataForWebAPI(Dictionary<string, string> displayAndColumnName, TCollection tlist,string exportFileName)
{
var file = ExcelStream(displayAndColumnName, tlist);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(file);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = exportFileName+".xls";
return result;
}
B-1:EXCEL数据导入--C#获取数据:
public class ExcelHelp
{
//获取http请求Request对象
public static HttpRequest baseRequest = HttpContext.Current.Request;
//获取http请求Response对象
public static HttpResponse baseResponse = HttpContext.Current.Response;
/// <summary>
/// 获取Post请求EXCEL文件数据
/// </summary>
/// <param name="fileFormName">EXCEL的表单名称</param>
/// <returns></returns>
public static DataTable GetExcelData(string fileFormName)
{
//获取Post请求--表单文件的文件名
string uploadFileName = baseRequest.Files[fileFormName].FileName;
//上传文件到指定目录(项目根目录/Resources/uploadFileName)--可根据项目文件目录进行调整
string path = HttpContext.Current.Server.MapPath("~/Resources/" + uploadFileName);
baseRequest.Files[fileFormName].SaveAs(path);
DataTable dataTable = new DataTable();
DataSet dataSet = new DataSet();
//解析文件数据,并存入服务器
//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
//"IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
string strConn = string.Format("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0}; Extended Properties = 'Excel 8.0;HDR=Yes;IMEX=1';", path);
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(dataSet);
)
{
dataTable = dataSet.Tables[];
}
if (System.IO.File.Exists(path))
{
//如果存在则删除
System.IO.File.Delete(path);
}
return dataTable;
}
}
B-2--EXCEL数据导入--NPOI--C#获取数据:
说明:以下方法借助第三方插件:NPOI专门处理EXCEL等办公文档的类库,因此项目中需引用该插件,NuGet--所有NPOI即可安装。
public HSSFWorkbook GetExcelDataByNPOI(string fileFormName)
{
HSSFWorkbook workbook = new HSSFWorkbook();
//获取Post提交的EXCEL文件
HttpPostedFile postFile = baseRequest.Files[fileFormName];
string uploadFileName = postFile.FileName;
//设置Excel临时保存路径(路径可修改,可作为参数传入)
string path = HttpContext.Current.Server.MapPath("~/Resources/" + uploadFileName);
postFile.SaveAs(path);
System.IO.File.Delete(path);
//文件流
using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
workbook = new HSSFWorkbook(stream);
ISheet sheet = workbook.GetSheetAt();
//Execel第一行是标题,不是要导入数据库的数据
//for (int i = 1; i <= sheet.LastRowNum; i++)
//{
// IRow row = sheet.GetRow(i);
// //获取行的文本内容
// string UserName = row.GetCell(0).StringCellValue;
// //获取行的时间内容
// DateTime time = row.GetCell(4).DateCellValue;
// //获取行的数字内容
// double num = row.GetCell(3).NumericCellValue;
// //获取行的bool内容
// bool b = row.GetCell(3).BooleanCellValue;
//}
}
return workbook;
}
#endregion
备注: 使用C#创建EXCEL,暂未研究,以后有空再做补充。
在编写本博客时,查阅了下面帮助博客:导入excel错误:外部表不是预期的格式 解决方案
C# 之 EXCEL导入导出的更多相关文章
- 利用反射实现通用的excel导入导出
如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...
- Excel导入导出的业务进化场景及组件化的设计方案(上)
1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...
- 关于Excel导入导出的用例设计
目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...
- ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...
- Excel导入导出帮助类
/// <summary> /// Excel导入导出帮助类 /// 记得引入 NPOI /// 下载地址 http://npoi.codeplex.com/rele ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- TP5.0 excel 导入导出
引第三方的phpexcel类库放到 ThinkPHP\Library\Vendor\demo下,自己建的文件夹demo 再将Excel.class放到ThinkPHP\Library\Org\clas ...
- Mego(04) - NET简单实现EXCEL导入导出
前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...
- JeeSite中Excel导入导出
在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel.CSV格式居多.如果是学习的过程中,最好是自己实现数据导入与导出的功能,然而在项目中,还是调用现成的功能比较好.近期一直使用 ...
随机推荐
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- vmware上网的方式
vmware上网设置 vmware虚拟机上网设置 我的一些心得,如下: 如何使vmware虚拟机中的操作系统能够上网? 第一种情况: 主机使用PPPOE拨号上网 方法一:NAT方式 1.先关闭虚拟机中 ...
- 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- javascript动画系列第四篇——拖拽改变元素大小
× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
- JS魔法堂:不完全国际化&本地化手册 之 理論篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
- 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...
- Flex 布局教程:语法篇
作者: 阮一峰 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便 ...
- 【JQ基础】DOM操作
内部插入:append() //向每个匹配的元素内部追加内容,可包含 HTML 标签 $(selector).append(function(index,html)) /*•index - 可选.接收 ...
- JQuery阻止事件冒泡
冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 我们在平时的开发过程中,肯定会遇到在一个div(这个div可以是元素)包裹一个div的情况,但是呢,在这两个div上都添加了事件,如果点 ...