这次项目遇到了一个导出excel需要对应排列的问题。本来在做这个项目之前都基本没做过excel导出的菜鸡,这次强行做还是有些忐忑的,加上那个表的结构比较奇特。

     废话不多说,先介绍表结构吧 是数据对应的排序周的表结构,一个列会有很多的周别信息,如下图展示:

由于才疏学浅,并没有遇到过这种列里面有16*2=32列的这种保存数据的方法,一列保存的是周别的信息,另一列保存的是数量信息。

     当时就有想啊,我擦那直接导出来不就好了,直接就对应上了多简单!但是转念一想呢,万一要导出的不止16条呢,那后面的怎么加呢,和同事商量之后,有个同事的做法是列转行,就是把这个所有的列都转成行,这样就能按照属性(周别和数量)全部拿到数据了,但是呢,但是我比较烦写存储过程,想自己想想办法,加上我这边的筛选条件是有一个选择周别区间的,所以我自己想了一个办法,处理了这类的表。

     这个界面能获取到的条件除了限定的这一条是属于谁的(查询条件的名称),还有就是起始周和周别和数量信息,这几个重要的信息了,值得一提的是,这里的起始周是这16列数据第一列的周别,所以是叫做起始周,这个字段可以好好的利用。

再重新解释下导出需求,导出要根据名称,导出的起始周和结束周往后推16这周的信息。这里为什么要推后16周呢,恩,需求书上说的,没有为什么。而且导出的数据要成那种菱形,就是那种那种额 不发图表达不了啊。。。还是发图吧。

就是这种前凸后翘的表格了,怎么说。。。

  这样看来,这里的首行的列名,也就是他们的列台头就很重要, 因为下面的数据都要与之对应的上,所有抬头必须要长,尽量的长长长长长。。。。。。。。。。。。。。。。。。。(大概这么长)。

到了这一步,也是可以参考同事说的那种,就是那种,那种列转行的做法的,把所有的列都存在一列之中,然后DISTINCT出来做列头这样。但是我是真的懒得写存储过程。。。。

  怎么做呢,前文提到我这里是有起始周的,于是我获取了结束周(这里的起始周和结束周都是可以与表中的起始周数据进行筛选的),然后往后推了16周,这样就能获取到所有查询到的数据的周别了。

然后让每一条数据的起始周与列的台头进行对比,如果周别是一样的,就放在对应的位置,上码上码!!!

  try
{
string InquiiryFile = HttpContext.Current.Server.MapPath("~") + "\\Excel\\xxx.xlsx";
if (!File.Exists(InquiiryFile))
{
Page.RegisterStartupScript("", "<script>alert( '无法加载样式表,请与管理员联系!')</script>");
}
//导出
DataTable DT = init();
if (DT.Rows.Count > )
{
Aspose.Cells.License lic = new Aspose.Cells.License();
lic.SetLicense("Aspose.Cells.lic");
Aspose.Cells.Workbook excel = new Aspose.Cells.Workbook();
excel.Open(InquiiryFile);
Aspose.Cells.Worksheet sheet = excel.Worksheets[];
sheet = excel.Worksheets[];
string startWeek = txtStartWeek.Value;
string endWeek = txtEndWeek.Value;
if (endWeek != "")
{
int weeknumber = Convert.ToInt32(endWeek.Substring(, ));
int years = Convert.ToInt32(endWeek.Substring(, ));
if (weeknumber + > )
{
weeknumber = weeknumber + - ;
if (weeknumber < )
{
years = years + ;
endWeek = years.ToString() + "" + weeknumber.ToString();
}
else
{
years = years + ;
endWeek = years.ToString() + weeknumber.ToString();
}
}
else
{
weeknumber = weeknumber + 16;
endWeek = years.ToString() + weeknumber.ToString();
}
}
string where = "1=1";
if (startWeek != "")
{
where += " and [monthName]>='" + startWeek + "'";
}
if (endWeek != "")
{
where += " and [monthName]<='" + endWeek + "'";
}
DataTable dtweek = bll.byWeek(where);//获取到了所有的周别
int dtweeknumber = dtweek.Rows.Count;
for (int i = ; i < dtweek.Rows.Count; i++)
{
sheet.Cells[, ( + i)].PutValue("WK" + (dtweek.Rows[i]["monthName"].ToString()).Substring(, ));
string monthName = dtweek.Rows[i]["startTime"].ToString();
monthName = monthName.Substring(, ) + "年" + monthName.Substring(, ) + "月" + monthName.Substring(, ) + "日";
sheet.Cells[, ( + i)].PutValue(monthName);
}
for (int i = ; i < DT.Rows.Count; i++)
{
sheet.Cells[i + , ].PutValue(DT.Rows[i]["Name"].ToString()); //名称
sheet.Cells[i + , ].PutValue("WK" + (DT.Rows[i]["startWeek"].ToString()).Substring(, )); //起始周
if (DT.Rows[i]["startWeek"] != DBNull.Value)
{
for (int j = ; j < dtweeknumber; j++)
{
if (DT.Rows[i]["startWeek"].ToString() == dtweek.Rows[j]["monthName"].ToString())
{
sheet.Cells[i + , + j].PutValue(Convert.ToInt32(DT.Rows[i]["wkN"]));//起始周的位置
for (int w = ; w < ; w++)
{
sheet.Cells[i + , + j + w].PutValue(Convert.ToInt32(DT.Rows[i]["wkN" + w + ""]));//后续的数据插入位置
}
}
}
} } sheet.AutoFitColumns();
string excelName = "xxx" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ".xlsx";
excel.Save(excelName, Aspose.Cells.FileFormatType.Excel2007Xlsx, Aspose.Cells.SaveType.OpenInExcel, HttpContext.Current.Response);
Response.End();
}
}
catch (Exception ex)
{
RegisterClientScriptBlock("", "<script>alert('" + ex.Message + "')</script>");
}

效果做出来了,可把我牛逼坏了,插会腰。

ASP.NET 导出EXCEL文件处理多对应排列的的更多相关文章

  1. asp.net 导出excel文件

    之前做过winfrom程序的导出excel文件的功能,感觉非常简单.现在试着做asp.net中导出excel的功能,之前用的是Microsoft.Office.Interop.Excel这个对象来实现 ...

  2. ASP.NET导出Excel文件

    第一种最常见,并且最简单的方式,直接把GridView导出,导出格式为文本表格形式. protected void btnSaveExcel_Click(object sender, EventArg ...

  3. ASP.NETCore -----导出Excel文件并下载

    本事例分为nopi(安装DotNetCore.NPOI)下载和EPPlus(EPPlus.Core.dll)下载,其中npoi下载演示的是根据执行的模板进行数据下载 npoi帮助类NpoiExcelU ...

  4. ASP.NET 导出excel文件出现乱码的解决办法

    string html =TABLE ;//<table>标签,可以是多张表string modified = Regex.Replace(html, "<table &g ...

  5. 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法

    -----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...

  6. ASP.NET Core导入导出Excel文件

    ASP.NET Core导入导出Excel文件 希望在ASP.NET Core中导入导出Excel文件,在网上搜了一遍,基本都是使用EPPlus插件,EPPlus挺好用,但商用需要授权,各位码友若有好 ...

  7. Asp.net导出Excel续章(自定义合并单元格,非Office组件)

    结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置 ...

  8. asp.net导出excel示例代码

    asp.net导出excel的简单方法. excel的操作,最常用的就是导出和导入. 本例使用NPOI实现. 代码:/// <summary> );             ;       ...

  9. [转] Asp.Net 导出 Excel 数据的9种方案

    湛刚 de BLOG 原文地址 Asp.Net 导出 Excel 数据的9种方案 简介 Excel 的强大之处在于它不仅仅只能打开Excel格式的文档,它还能打开CSV格式.Tab格式.website ...

随机推荐

  1. flask-login ----系统权限设计部分小结

    tips: 事实证明.开发是一项苦力活.但是代码只有自己写的才是令人感到放心的.不过仅仅是从开发角度来说.从维护和安全角度来说,当然还是引入模块比较爽 但是引入的模块总会有一些问题.碰到的最大问题就是 ...

  2. SAP ECC EHP7 RFC 发布成WebService

    1.说明介绍 本文将RFC发布成WebService的详细步骤,参考了百度经验http://jingyan.baidu.com/article/8275fc867c9e2946a13cf66c.htm ...

  3. nmon指标

    表字段分析 关键指标类型 关键指标名称 关键指标含义 SYS_SUMM CPU% cpu占有率变化情况: IO/sec IO的变化情况: AAA AIX AIX版本号: cpus CPU数量: har ...

  4. MySql学习笔记(一) —— 数据的分组

    前面介绍的聚集函数只是用来计算行数,平均数,最大值,最小值而不用检索所有数据.通过count()函数,我们可以计算生产商1003提供的产品数目,但如果我要查询所有生产商提供的商品数,这就需要进行分组查 ...

  5. struts2.1.6教程十二、总结

    本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例. 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官 ...

  6. 5.Lock接口及其实现ReentrantLock

    jdk1.7.0_79 在java.util.concurrent.locks这个包中定义了和synchronized不一样的锁,重入锁——ReentrantLock,读写锁——ReadWriteLo ...

  7. 改进Android语音对讲系统的方法

    本文属于Android局域网内的语音对讲项目系列,<实时Android语音对讲系统架构>阐述了局域网内Android语音对讲功能的框架,本文在此基础上进行了优化,包括音频的录制.播放,通信 ...

  8. 从零开始理解JAVA事件处理机制(2)

    第一节中的示例过于简单<从零开始理解JAVA事件处理机制(1)>,简单到让大家觉得这样的代码简直毫无用处.但是没办法,我们要继续写这毫无用处的代码,然后引出下一阶段真正有益的代码. 一:事 ...

  9. 推荐五款Android 应用的自动化测试工具

    如今自动化测试已经应用到每天的测试中.这不足为奇,因为自动化测试在测试过程中节约了时间,还能避免包括人为因素造成的测试错误和遗漏. 自动化测试工具选择很多.一些是开源的,一些非常贵.一些自动化工具是几 ...

  10. unity3D:游戏分解之曲线

    一提到曲线,很多新手就头疼了,包括我.查了很多资料,终于有个大概的了解.想深入了解曲线原理的,推荐一个链接http://www.cnblogs.com/jay-dong/archive/2012/09 ...