Excel 多表头导入导出(借助Aspose)
需求中Excell多表头,完成导入导出。

Aspose 代码实现多表头方式借助代码比较繁琐, 借助模板方式。 简化逻辑。 注意,aspose从0开始索引。
导入部分代码: 实现选择导入Excel,导入Excel后,转换成DataTable, 同时将列明替换成数据库映射字段。(注意,严谨情况下需要比对导入Excel和模板Excel列是否相同,此处逻辑省略。)
//读取Excel模板
var wb = new Workbook(Request.Files[0].InputStream);
if (wb.Worksheets.Count <= 0)
{
return Ext.Net.JSON.Serialize(new { success = false, msg = "不是有效的Excel文件" });
}
var ws = wb.Worksheets[0];
var sheet = ws;
//读取Excel内容并将DataTable表头转换为数据库字段。
//页面Grid集合
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = int.MaxValue;
var gridHeaders= new List<NameDataExeclOrderMap>().DeserializeModel(GridHeaders);
var GridModelsList = new { name = "", type = "" }.NMList().DeserializeModel(GridModels);
int firstStartDataRow = 3;
var ExcelDt = ws.Cells.ExportDataTableAsString(firstStartDataRow, 0, ws.Cells.MaxDataRow - firstStartDataRow + 1, gridHeaders.Count, false);
var ExcelRows = ExcelDt.Rows.Cast<DataRow>();
Func<int, string> ExcelColumnName2DTColumnName = (int colIndex) =>
{
return gridHeaders.Where(a => a.MapExcelColOrder == colIndex + 1).Select(a => a.DataIndex).FirstOrDefault();
};
for (var i = 0; i < ExcelDt.Columns.Count; i++)
{
var findCN = ExcelColumnName2DTColumnName(i);
if (!string.IsNullOrWhiteSpace(findCN))
{
ExcelDt.Columns[i].ColumnName = findCN;
}
}
//前台传送表头(用于显示,映射数据库字段,MapExcelColOrder )
public class NameDataExeclOrderMap
{
public int MapExcelColOrder {get;set;}
public string DataIndex { get; set; }
public string Text { get; set; }
}
需要前台传送的 表头格式:

导出模式(部分代码):
var ExcelTemplateFileName = Server.MapPath(@"\App_Data\ExcelTemplate\导入导出模板.xls");
Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(ExcelTemplateFileName);
var sheet = wb.Worksheets[0];
var cellRowIndex = 3; //Excel开始写的行
foreach (var row in dt.AsEnumerable())
{
foreach (var col in nameKeyMapOrderLst)
{
if (dt.Columns.Contains(col.DataIndex))
{
sheet.Cells[cellRowIndex, col.MapExcelColOrder - 1].PutValue(row.GetRowValue(col.DataIndex));
}
else
{
sheet.Cells[cellRowIndex, col.MapExcelColOrder - 1].PutValue("");
}
sheet.Cells[cellRowIndex, col.MapExcelColOrder - 1].SetStyle(_tdStyle);
}
cellRowIndex++;
}
string fileName = _reportName + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
wb.Save(System.Web.HttpContext.Current.Server.MapPath("~/ExportFile/") + fileName);
var Request = System.Web.HttpContext.Current.Request;
return "http://" + Request.Url.Host + ":" + Request.Url.Port + "/ExportFile/" + fileName;
Excel 多表头导入导出(借助Aspose)的更多相关文章
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 利用PHPExcel 实现excel数据的导入导出(源码实现)
利用PHPExcel 实现excel数据的导入导出(源码实现) 在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现 提前将phpexcel类下 ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...
- SSM excel文件的导入导出
对于excel文件的导入导出,后台接收读取和建表封存都是固定死的,所以对于excel导入时,excel文件内容必须匹配后台相关对象,不然报错. excel文件导出,用<a><a/&g ...
- SQL SERVER 和ACCESS、EXCEL的数据导入导出
SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06] 来源:Linux公社 作者:Linux 熟 悉 ...
- VB中Excel 2010的导入导出操作
VB中Excel 2010的导入导出操作 编写人:左丘文 2015-4-11 近来这已是第二篇在讨论VB的相关问题,今天在这里,我想与大家一起分享一下在VB中如何从Excel中导入数据和导出数据到Ex ...
- 使用phpExcel实现Excel数据的导入导出(完全步骤)
使用phpExcel实现Excel数据的导入导出(完全步骤) 很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人 ...
- Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
1.简介 本文主要给大家介绍了关于Laravel 5用Laravel Excel实现Excel/CSV文件导入导出的相关内容,下面话不多说了,来一起看看详细的介绍吧. Laravel Excel 在 ...
- Spring Boot框架下实现Excel服务端导入导出
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.今天 ...
- Excel基于POI导入导出的Annotation化之路(一)
Excel在web项目里的使用变得越来越广泛,特别是和线下耦合度较高的业务,Excel导入导出变得非常频繁,尽管很多人写了诸多的工具方法,但是终究没有解决一个问题:有效的控制字段英文名称和实际表头名称 ...
随机推荐
- mysql 取出分组后价格最高的数据
如何用mysql 取出分组后价格最高的数据 ? 看到这个问题,就想到了用 max 函数和 group by 函数,先 group by 然后取得 max, 但是这样真的可以吗? 不可以 ! 为什么? ...
- div css 页面中心弹窗窗口
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- Linux下如何排查CPU及内存占用过多
CPU 使用top命令,然后按shift+p按照CPU排序,找到占用CPU过高的进程pid. 使用top -H -p pid命令,找到进程中消耗资源最高的线程ppid. 使用echo 'obase=1 ...
- 安全漏洞之grafana-cve_2021_43798
漏洞说明 一个可绕过用户登录进行任意文件读取的漏洞 环境搭建 我使用的是vulfocus提供的vulfocus/grafana-cve_2021_43798 ,由vulfocus后台统一管理 利用脚本 ...
- 大二下学期开学java测试
我们在2月13日下午进行了java测试(是一个新闻类型的题),通过这一个测试我进行了以下总结: 我对于javaweb的框架构建和加密密码,还有一些不同人物功能的实现,使得我在这次得考试中成绩不太理想. ...
- python 快速搭建局域网文件服务器 SimpleHTTPServer http.server
py2: python2 -m SimpleHTTPServer [port] py3: python3 -m http.server [port] python2请注意大小写. 在Windows ...
- kubernetes中 pause的作用
pause的作用 重要概念:Pod内的容器都是平等的关系,共享Network Namespace.共享文件 pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名 ...
- linux开机启动执行脚本或命令
添加到 /etc/rc.d/rc.local 给文件执行权限 /etc/rc.d/rc.local 用于用户自定义开机启动程序,可以往里写开机要执行的命令或脚本,线上的配置如下: [r ...
- adb查看包名
方法一:adb shell pm list packages 方法二:adb shell dumpsys activity activities (前提条件:手机应用上只启动你要用的APP) 方法三: ...
- [2007年NOIP普及组] Hanoi双塔问题
给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将 这些国盘移到C柱上,在移动过 ...