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导入导出变得非常频繁,尽管很多人写了诸多的工具方法,但是终究没有解决一个问题:有效的控制字段英文名称和实际表头名称 ...
随机推荐
- 在Vue中实现app拍照-选取本地图库-图片上传成功后预览
基于Vue和uni-app实现手机app的功能实现和打包.拍照功能和选取本地图片使用的是HTML5的API 实现. 我为测试这个功能使用node写了个本地服务器,对于手机调试,可以通过连接同一个无线网 ...
- 5.docker安装redis
下载redis镜像 不讲那么细了,可以参考docker安装mysql的介绍 docker pull redis 不加冒号和版本表示下载最新版本的 镜像下载完后可以数据 docker images 命令 ...
- CF1067E 题解
题意 传送门 给定一棵 \(n\) 个节点的树,每条边有 \(\frac{1}{2}\) 的概率出现,可以得到一个森林,求这个森林邻接矩阵的秩的期望. \(1\le n\le5\times10^5\) ...
- 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组
var threeSum = function(nums) {let ans = [];const len = nums.length;if(nums == null || len < 3) r ...
- rhel8.0配置本地 yum 源
1.首先挂载cdromcat >> /etc/fstab <<EOF/dev/sr0 /media iso9660 ...
- Vue路由跳转时定位到页面顶部
代码如下: router.afterEach((to, from, next) => { document.body.scrollTop = 0; document.documentElemen ...
- Python面向对象编程——一些类定义(杂)
一.abstractmethod 子类必须全部实现重写父类的abstractmethod方法 非abstractmethod方法可以不实现重写 带abstractmethod方法的类不能实例化 fro ...
- Jmeter完整全套接口流程
根据实际项目,编写一套完整的接口流程 项目流程介绍: 借款流程需要调用的接口,依次为: 前置校验:主要通过手机号验证该用户是存量用户,若撞库,则不允许继续操作: 用户注册:通过手机号+身份证号进行注册 ...
- Yii2安装步骤
通过 Composer 安装了半天一直网络报错,配置了镜像,又报错依赖,运行跳过依赖,这个命令还是报错,我裂开. 最后只能利用归档文件安装,1.下http://www.yiiframework.com ...
- 排球计分程序的uml图