导出Excel实现 (ASP.NET C# 代码部分)
背景: 实现导出Excel功能.
技术: ASP.NET , 采用`Aspose.Cells`第三方组件, C# 实现通用部分.
根据前台Ext Grid完成导入Excel中文列与实际存储列的对应关系. 组织完 Workbook 组织, 保存到Server临时目录, 返回地址下载, 每次都为新故文件名 采用了 随机数:
//_reportName :Excel名称
//_reportName: 报表名称
//_headerStruct: 包含数据库列与Excel中文列的对应关系. (此处取Ext表头) public string ExportServerExcelFile(Aspose.Cells.Workbook w, string fileName)
{
if (!Directory.Exists(Server.MapPath("~/ExportFile/")))
Directory.CreateDirectory(Server.MapPath("~/ExportFile/")); w.Save(Server.MapPath("~/ExportFile/") + fileName); return "http://" + Request.Url.Host + ":" + Request.Url.Port + "/ExportFile/" + fileName;
} public string ExportExcelAll(string queryP, string _reportName, string _headerStruct)
{
DataTable dt = ....; //取查到库中数据
string jsonData = Ext.Net.JSON.Serialize(dt); Workbook w = this.CreateWorkbook(jsonData, _reportName, _headerStruct);
string fileName = _reportName.Split('(')[0] + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; return this.ExportServerExcelFile(w, fileName);
} public Workbook CreateWorkbook(string jsonData, string _reportName, string _headerStruct)
{
var w = new Workbook(); Worksheet ws = (Worksheet)w.Worksheets[0];
if (!string.IsNullOrEmpty(_headerStruct))
SerHeader1(JSON.Deserialize<dynamic[]>(_headerStruct), ws);
RangeHeader(ws);
//设置标题
ws.Cells[0, 0].PutValue(_reportName);
Range titleRange = ws.Cells.CreateRange(0, 0, 1, lastColIndex); #region ===样式
var style = new Style { HorizontalAlignment = TextAlignmentType.Center, Font = { Size = 25, IsBold = true } };
style.Borders.SetStyle(Aspose.Cells.CellBorderType.Thin);
style.Borders.DiagonalStyle = Aspose.Cells.CellBorderType.None;
var styleFlag = new StyleFlag
{
HorizontalAlignment = true,
VerticalAlignment = true,
Font = true,
FontSize = true,
FontBold = true,
Borders = true
};
titleRange.ApplyStyle(style, styleFlag);
titleRange.RowHeight = 26;
titleRange.Merge(); var cellStyle1 = new Style();
cellStyle1.Borders.SetStyle(Aspose.Cells.CellBorderType.Thin);
cellStyle1.Borders.DiagonalStyle = Aspose.Cells.CellBorderType.None;
cellStyle1.IsTextWrapped = true; var cellStyleNumber = new Style();
cellStyleNumber.Borders.SetStyle(Aspose.Cells.CellBorderType.Thin);
cellStyleNumber.Borders.DiagonalStyle = Aspose.Cells.CellBorderType.None;
cellStyleNumber.Number = 2;
#endregion //列集合
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = int.MaxValue;
List<grid> _Test = serializer.Deserialize<List<grid>>(_headerStruct); var companies = JSON.Deserialize<Dictionary<string, string>[]>(jsonData); for (int i = 0; i < companies.Length; i++)
{
int tmpColIndex = 0;
foreach (var item in companies[i])
{
if (headerNames.IndexOf(item.Key) > -1)
{
var list = _Test.Where(p => p.DataIndex == item.Key).ToList(); //获取列名称
var cColumn = list[0]; //初始样式
ws.Cells[lastLevel + 1 + i, headerNames.IndexOf(item.Key)].SetStyle(cellStyle1, true); if (cColumn.DataType == "float" || cColumn.DataType == "decimal") //1. 数字类型
{
if (IsDecimal(item.Value))
{
ws.Cells[lastLevel + 1 + i, headerNames.IndexOf(item.Key)].PutValue(ToDouble(item.Value));//金额保留2位数
//ws.Cells[lastLevel + 1 + i, headerNames.IndexOf(item.Key)].SetStyle(cellStyleNumber);
}
}
else if (cColumn.DataType == "date") //2. 日期类型
{
ws.Cells[lastLevel + 1 + i, headerNames.IndexOf(item.Key)].PutValue(
(string.IsNullOrWhiteSpace(item.Value) ? "" : Convert.ToDateTime(item.Value).ToString("yyyy-MM-dd hh:mm:ss"))
);
}
else //3. 字符串和集合类型auto
{
ws.Cells[lastLevel + 1 + i, headerNames.IndexOf(item.Key)].PutValue(item.Value);
} //★获得要隐藏的列
if (cColumn.Hiden == true)//列需要隐藏: 字典类型
{
var index = headerNames.IndexOf(item.Key);//列索引
ws.Cells.HideColumn(index);
}
}
tmpColIndex++;
}
} return w;
}
private void RangeHeader(Worksheet ws)
{
for (int row = 1; row <= lastLevel; row++)
{
for (int col = 0; col < lastColIndex; col++)
{
var style = new Style
{
HorizontalAlignment = TextAlignmentType.Center,
VerticalAlignment = TextAlignmentType.Center
};
style.Borders.SetStyle(Aspose.Cells.CellBorderType.Thin);
style.Borders.DiagonalStyle = Aspose.Cells.CellBorderType.None;
var styleFlag = new StyleFlag
{
HorizontalAlignment = true,
VerticalAlignment = true,
Font = true,
FontSize = true,
FontBold = true,
Borders = true
}; ws.Cells[row, col].SetStyle(style);
if (ws.Cells[row, col].Value != null)
{
RangeCell(ws, row, col);
}
}
}
foreach (Range item in rc.Where(m => m != null))
{
var style = new Style
{
HorizontalAlignment = TextAlignmentType.Center,
VerticalAlignment = TextAlignmentType.Center
};
style.Borders.SetStyle(Aspose.Cells.CellBorderType.Thin);
style.Borders.DiagonalStyle = Aspose.Cells.CellBorderType.None;
var styleFlag = new StyleFlag
{
HorizontalAlignment = true,
VerticalAlignment = true,
Font = true,
FontSize = true,
FontBold = true,
Borders = true
}; item.ApplyStyle(style, styleFlag);
try
{
item.Merge();
}
catch (Exception)
{
}
}
}
/// <summary>
/// grid表头
/// </summary>
[Serializable]
public class grid
{
public string Text { get; set; }
public string DataIndex { get; set; }
public string Width { get; set; }
public List<grid> Cols { get; set; }
public bool Hiden { get; set; }
public string xtype { get; set; }
public string DataType { get; set; }//列类型
}
其中, 传入
_headerStruct
参数格式截图所示, 包括grid 类用于反序列化, 类似于, 关键用到了Text, DataType, DataIndex 关键, 特殊处理了Ext的多表头, 例如Cols 非末级就忽略了(函数
RangeHeader的作用
):

导出Excel实现 (ASP.NET C# 代码部分)的更多相关文章
- vue项目中导出Excel文件功能的前端代码实现
在项目中遇到了两种不同情况, 1.get请求导出文件,实现起来相对简单 // 导出数据 exportData() { window.location.href = `/oes-content-mana ...
- ASP.NET Core 导入导出Excel xlsx 文件
ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...
- [转]Java中导入、导出Excel
原文地址:http://blog.csdn.net/jerehedu/article/details/45195359 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样 ...
- easyui datagrid导出excel
[第十四篇]easyui datagrid导出excel <a class="btn btn-app" onclick="exportExcel()" ...
- Java中导入、导出Excel
原文:Java中导入.导出Excel 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已 ...
- Java中使用poi导入、导出Excel
一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...
- Npoi导出excel整理(附源码)
前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...
- 【转载】Java导入导出excel
转自:https://blog.csdn.net/jerehedu/article/details/45195359 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI ...
- Java中导入导出Excel -- POI技术
一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实 ...
随机推荐
- 线程池threadPools
1.线程池是用来存储线程的容器 2.Executors.newFixedThreadPool(int n);创建线程池,并且设置线程池的容量为n 3.submit开启线程 4.会返回一个对象futur ...
- RabbitMQ环境安装及入门
1. 说明 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方, ...
- Linux获取so/ko文件版本号教程
一.需要获取版本号的原因 从使用角度而言,有时只有特定版本的库才支持某些功能,所以我们需要确定库文件版本号. 从安全加固角度而言,有些版本存在漏洞有些版本不存在漏洞,所以我们需要获取版本号以确定当前使 ...
- java常见3种文件上传速度对比和文件上传方法详细代码
在java里面文件上传的方式很多,最简单的依然是FileInputStream.FileOutputStream了,在这里我列举3种常见的文件上传方法代码,并比较他们的上传速度(由于代码是在本地测试, ...
- 【Java集合系列三】Vector-Stack解析
2017-07-29 12:59:14 一.简介 1.Vector继承关系 2.Vector类扩容 Vector类的实现和ArrayList极其相似,都使用数组存储元素,但是扩容策略不一样,Array ...
- Alpha冲刺6
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10004107.html 作业博客:https://edu.cnblogs.com/campus ...
- dos语法
一)MD——建立子目录 1.功能:创建新的子目录 2.类型:内部命令 3.格式:MD[盘符:][路径名]〈子目录名〉 4.使用说明: (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前 ...
- 1.6 selenium3+firefox环境搭建
1.6 selenium3+firefox环境搭建 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的.(备注:这里 ...
- jQuery-2.DOM---节点插入
DOM内部插入append()与appendTo() 动态创建的元素是不够的,它只是临时存放在内存中,最终我们需要放到页面文档并呈现出来.那么问题来了,怎么放到文档上? 这里就涉及到一个位置关系,常见 ...
- Windows CMD 支持ls命令
/********************************************************************** * Windows CMD 支持ls命令 * 说明: * ...