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导入导出变得非常频繁,尽管很多人写了诸多的工具方法,但是终究没有解决一个问题:有效的控制字段英文名称和实际表头名称 ...
随机推荐
- FB50 过帐码 没有定义
FB50 提示"过帐码 没有定义" --ECC6.0&Logon730 转至事务码:OBX1 或找到->定义总账科目过账的过账吗 定义借记 40 贷方 50,保存即 ...
- 如何把腾讯地图左边的搜索结果导出成excel里?
最近,又有朋友让我再写一个 腾讯地图 采集商家的地址,电话信息. 原理应该差不多,我就查阅了下腾讯地图的采集规则,编写了专门针对腾讯地图的采集软件. 界面上和百度地图的采集软件基本类似,但是不用选择区 ...
- ComPiler200004:Library-Oriented Programming
https://www.aliyun.com/jiaocheng/403982.html 摘要: Creating a simple, encapsulated, maintainable libra ...
- Vue非父子組件(爺孫關係)通信Provide&&Inject
通常,当我们需要从父组件向子组件传递数据时,我们使用 props.想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容.在这种情况下,如果仍然将 prop 沿着组件链逐级传递 ...
- 接入B站iframe视频(bilibili引用视频)
感谢 https://blog.csdn.net/xinshou_caizhu/article/details/94028606 我们在查看其它资料的时候,视频总加载失败,后来发现是少了 https: ...
- 2019-2020-1 20199318《Linux内核原理与分析》第八周作业
第7章 可执行程序工作原理 一.学习笔记 1.ELF 2.程序编译 3.连接与库 二.试验记录 1.开始先更新内核,再用test_exec.c将test.c覆盖掉 2.test.c文件中增加了exec ...
- 「SOL」E-Lite (Ural Championship 2013)
为什么这数据能水到可以枚举角度 ac 啊 # 题面 给你 \(n\) 个平面向量 \((x_i,y_i)\),对于每个 \(k=1\sim n\),求「从给出的 \(n\) 个向量中不重复地选择 \( ...
- MySQL Debug大全
nested exception is java.sql.SQLException: com.mysql.jdbc.Driver 下面还有个class not found 用的8的数据库connect ...
- defer和async区别
浏览器会立即加载JS文件并执行指定的脚本,"立即"指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行 加上async属性,加载 ...
- mysql之存储引擎-第二篇
什么是存储引擎? 数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建,查询,更新和删除数据操作.不同的存储引擎提供了不同的存储机制,索引技巧及特定功能. 存储引擎类型 InnoDB ...