告别ASPNET操作EXCEL的烦恼(总结篇)

时间:2019-05-11 22:47:08下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《告别ASPNET操作EXCEL的烦恼(总结篇)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《告别ASPNET操作EXCEL的烦恼(总结篇)》。

第一篇:告别ASPNET操作EXCEL的烦恼(总结篇)

Copy From 告别ASP.NET操作EXCEL的烦恼(总结篇)

公元19XX年前,关于EXCEL的操作就如滔滔江水,连绵不绝,真正操作EXCEL我也是从去年下半年开始的,有些比较复杂的年度报表之类的,做起来也有点费力,不过还是都能画出来了,关于EXCEL的报表导出,考虑到导出耗时的问题我主要采用AJAX来做的,分别捕捉几个起止状态,给客户端提示3个状态:正在检索数据。。---》准备导出数据。。(只是从数据库成功取出,还没有读写excel文件)--》正在读写文件--》导出数据成功,当然如果哪一过程出错,都有对应的提示,只所以想到写这篇文章,主要是因为今年有个系统的部分EXCEL的操作也让我做,顺便结合之前操作EXCEL的经验作一下总结,可能也算不上什么,对于绝大多数来说也没什么技术含量,网上一搜一大把,但我想还是有必要总结一下,至少能给园子里的新手些许帮助,OK,Let's Go...一.程序操作EXCEL的应用主要还是在统计报表方面,您可能会考虑读EXCEL模板,也可能会考虑没必要读模板,其实读不读模板都能达到一样的效果,看实际情况而用了。

1.读模板的话,首先模板存放在某个路径下,根据模板把从数据库里取出的数据写回EXCEL然后生成一个新的EXCEL存放都另一个路径以供下载,模板不变。

我这里的EXCEL操作主要是在VS2005里的,VS2003也可以的,不过没怎么研究03里的操作(文章最后我会把05,03的示例下载地址贴上)vs05中操作EXCEL直接引用.NET自带的COM组件,添加后项目的bin目录下会自动出现

Interop.Excel.dll这个DLL(需安装office2003 excel,下面的说明及示例都是基于office2003的,版本不同调用可能会不一样)页面的命名空间引用 using Excel;下面是调用模板的一段代码

1#region 使用模板导出Excel表 2case“ReportByTemp”: 3 { 4

DataView dv = Cache[“ReportByTemp”] as DataView;6//建立一个Excel.Application的新进程

Excel.Application app =new Excel.Application();8if(app ==null)9 { 10return;11 } 12 app.Visible =false;13 app.UserControl =true;14 Workbooks workbooks = app.Workbooks;15 _Workbook workbook = workbooks.Add(template_path +“EXCEL测试模板.xls”);//这里的Add方法里的参数就是模板的路径 Sheets sheets = workbook.Worksheets;17 _Worksheet worksheet =(_Worksheet)sheets.get_Item(1);//模板只有一个sheet表 18if(worksheet ==null)19 { 20return;21 } 22

23int rowNum =0;24for(int i =0;i < span> dv.Count;i++)25 { 26 rowNum = i +1;27 worksheet.Cells[3+ i, 1] = rowNum;28 worksheet.Cells[3+ i, 2] = dv[i].Row[0].ToString();29 worksheet.Cells[3+ i, 3] = dv[i].Row[1].ToString();30

excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]);//黑体

excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]);//居中

worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);34

} 36

tick = DateTime.Now.Ticks.ToString();38 save_path = temp_path +“"+ tick +”.xls“;39 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);40 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程 41

} 43break;44#endregion 效果如下:

2.不读模板的话,调用的时候其实会继承一个空白模板,然后写入数据,程序画表头,最终达到一样的效果,程序如下:

1#region 不使用模板生成Excel表 2case”ReportByNone“: 3 { 4

DataView dv = Cache[”ReportByNone“] as DataView;6//建立一个Excel.Application的新进程

Excel.Application app =new Excel.Application();8if(app ==null)9 { 10return;11 } 12 app.Visible =false;13 app.UserControl =true;14 Workbooks workbooks = app.Workbooks;15 _Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);//这里的Add方法里的参数就相当于继承了一个空模板(暂这样理解吧)16 Sheets sheets = workbook.Worksheets;17 _Worksheet worksheet =(_Worksheet)sheets.get_Item(1);18if(worksheet ==null)19 { 20return;21 } 22 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 3]).Merge(Missing.Value);//横向合并 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Value2 =”EXCEL测试一“;25 excelOperate.SetBold(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1]);//黑体 26 excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1]);//居中 excelOperate.SetBgColor(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], System.Drawing.Color.Red);//背景色 excelOperate.SetFontSize(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 16);//字体大小 excelOperate.SetRowHeight(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 32.25);//行高 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色连续边框 31

worksheet.Cells[2, 1] =”序号“;33 worksheet.Cells[2, 2] =”公司“;34 worksheet.Cells[2, 3] =”部门“;35 excelOperate.SetBold(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 3]);//黑体 36 worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[2, 3]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);37 excelOperate.SetHAlignRight(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 3]);38 excelOperate.SetBgColor(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 3], System.Drawing.Color.Silver);//背景色 39int rowNum =0;40for(int i =0;i < span> dv.Count;i++)41 { 42 rowNum = i +1;43 worksheet.Cells[3+ i, 1] = rowNum;

出44 worksheet.Cells[3+ i, 2] = dv[i].Row[0].ToString();45 worksheet.Cells[3+ i, 3] = dv[i].Row[1].ToString();46

excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]);//黑体

excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]);//居中

worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//设置边框颜色,不然打印预览,会非常不雅观 50

} 52 excelOperate.SetColumnWidth(worksheet, ”A“, 10);53 excelOperate.SetColumnWidth(worksheet, ”B“, 20);54 excelOperate.SetColumnWidth(worksheet, ”C“, 20);55 worksheet.Name =”导出EXCEL测试一“;56

tick = DateTime.Now.Ticks.ToString();58 save_path = temp_path +”“+ tick +”.xls“;59 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);60 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程 61

} 63break;64

65#endregion 效果如下:

以上我给了两个最简单的操作说明,下面详细说一下对于一些稍微复杂的报表的生成处理

二.对于复杂的EXCEL报表的生成处理,无非是纵向合并相同的数据行及嵌套纵向合并等一些操作,下面就几个具有针对性的报表作下说明.1.要生成相对复杂的EXCEL表,在从数据库取数据时,要注意先按照合理的要求排好序,有时候可能order by后面要跟好几个字段,而且这几个字段谁先谁后也要注意,因为这些会直接影响报表呈现的效果,比如你的EXCEL表要按月份统计国内外的项目,显示出来的时候要多个项目相同的人连续,那么排序就可能要这样order by 月份,项目类别,用户ID,项目ID(这是写好的视图,基于视图来检索的),这个排序的字段顺序就不能变了,变了的话就不太好生成想要的形式了,如下图: 这个也是动态画的,用了个简单的模板,模板就一个表头,没多大意义,除非表头很复杂而且在列表中不需要重画,考虑模板就比较好,向上面那个一月份国际的和其它月份的都是需要重画表头的。至于合并,如果不是嵌套的合并,我们可以在向模板循环写数据的时候直接控制,比如下面一个简单的写法:

1for(i =0;i < span> table.Rows.Count;i++)2 { 3 bidName = table.Rows[index][”BIDNAME“].ToString();4if(table.Rows[i][”BIDNAME“].ToString()== bidName)5 { 6 projNum++;7 worksheet.Cells[5+ i, 2] = table.Rows[i][”PROJNO“];8 worksheet.Cells[5+ i, 3] = table.Rows[i][”PROJNAME“];9 worksheet.Cells[5+ i, 4] = table.Rows[i][”STAT_DATE“];10 worksheet.Cells[5+ i, 5] = table.Rows[i][”PROJTYPE“];11 worksheet.Cells[5+ i, 6] = table.Rows[i][”CONTENT“];12 worksheet.Cells[5+ i, 7] = table.Rows[i][”OPENDT“];13 worksheet.Cells[5+ i, 8] = table.Rows[i][”OPENADDRESS“];14 worksheet.Cells[5+ i, 9] = table.Rows[i][”REV_DATE“];15 worksheet.Cells[5+ i, 10] = table.Rows[i][”BID_UNIT“];16 worksheet.Cells[5+ i, 11] = table.Rows[i][”AGT_AMOUNT“];17 worksheet.Cells[5+ i, 12] = table.Rows[i][”CURRENCY“] +”:“+ table.Rows[i][”BIDSER_AMOUNT“];18 worksheet.Cells[5+ i, 13] = table.Rows[i][”SENDDATE“];19 worksheet.Cells[5+ i, 14] = table.Rows[i][”CURRENCY“] +”:“+ table.Rows[i][”BIDPRICE“];20 worksheet.Cells[5+ i, 15] = table.Rows[i][”BOOKAMOUNT“];21 worksheet.Cells[5+ i, 16] = table.Rows[i][”CURRENCY“] +”:“+ table.Rows[i][”BAIL_AMOUNT“];22 worksheet.Cells[5+ i, 17] = table.Rows[i][”USERNAME“];23 worksheet.Cells[5+ i, 18] = table.Rows[i][”SECOND_USER“];24 worksheet.Cells[5+ i, 19] =”“;25 worksheet.get_Range(worksheet.Cells[5+ i, 1], worksheet.Cells[5+ i, 19]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);26continue;27 } 28 worksheet.get_Range(worksheet.Cells[5+ rowid, 1], worksheet.Cells[5+ i-1, 1]).Merge(Missing.Value);//将第一列按投标单位合并 worksheet.get_Range(worksheet.Cells[5+ rowid, 1], worksheet.Cells[5+ rowid, 1]).Value2 = bidName +”(“+ projNum.ToString()+”个项目)“;//合并后的单元格内容

合并单元格的时候也要注意一个问题,就是合并的单元格必须是为空的,不然在执行合并时,会提示“合并后的单元格的值将丢失”,具体不这样提示的,大致是这个意思,一般我们合并都单元格相同的内容,在合并前我们先保存那个值,再清空后合并,上面的代码中把worksheet.Cell[5+rowid,1]这里系列的单元格的值空出来了,没写数据,而且最后合并了再写值,避免了去循环清空。

2.嵌套的合并向上面那样做可能控制比较麻烦,而且思路可能很混乱,我们可以考虑先循环填充所有的数据,在循环出来要合并的列,比如像下面的这张表 先循环填充数据,如下:

1int index =0, rownum =0;2string ProjNo =”“;3for(i =0;i < span> table.Rows.Count;i++)4 { 5 ProjNo = table.Rows[index][”PROJNO“].ToString();6if(table.Rows[i][”PROJNO“].ToString()== ProjNo)7 { 8 wksheet.Cells[3+ i, 1] = rownum +1;9 wksheet.Cells[3+ i, 2] =”'“+ table.Rows[i][”PROJNO“];//加上单引号保证以0开头的字符原样输出 10 wksheet.Cells[3+ i, 3] =”'“+ table.Rows[i][”PROJNAME“];11 wksheet.Cells[3+ i, 4] =”'“+ table.Rows[i][”PA_NAME“];12 wksheet.Cells[3+ i, 5] =”'“+ table.Rows[i][”BIDER_NAME“];13 wksheet.Cells[3+ i, 6] = table.Rows[i][”BAIL_AMOUNT“];14 wksheet.Cells[3+ i, 7] = table.Rows[i][”NOT_BACK“];15 wksheet.get_Range(wksheet.Cells[3+ i, 1], wksheet.Cells[3+ i, 7]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);16continue;17 } 18 index = i;20 rownum++;21 i--;22 } 下面合并前三列相同内容的单元:

1//合并前三列操作 2int m =1, rowid =3, k;3string projName =”“;4for(k =3;k < span> i +2;k++)5 { 6if(Convert.ToInt32(wksheet.get_Range(wksheet.Cells[k, 1], wksheet.Cells[k, 1]).Value2)== m)7 { 8 ProjNo = wksheet.get_Range(wksheet.Cells[k, 2], wksheet.Cells[k, 2]).Value2.ToString();9 projName = wksheet.get_Range(wksheet.Cells[k, 3], wksheet.Cells[k, 3]).Value2.ToString();10 wksheet.get_Range(wksheet.Cells[k, 1], wksheet.Cells[k, 1]).Value2 =”“;11 wksheet.get_Range(wksheet.Cells[k, 2], wksheet.Cells[k, 2]).Value2 =”“;12 wksheet.get_Range(wksheet.Cells[k, 3], wksheet.Cells[k, 3]).Value2 =”“;13continue;14 } 15 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[k-1, 1]).Merge(Missing.Value);16 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[rowid, 1]).Value2 = m;17 wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[k-1, 2]).Merge(Missing.Value);19 wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[rowid, 2]).Value2 =”'“+ ProjNo;20 wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[k-1, 3]).Merge(Missing.Value);22 wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[rowid, 3]).Value2 =”'“+ projName;23 m++;25 rowid = k;26 k--;27 } 28//跳出循环后合并最后一个招标项目 29 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[k-1, 1]).Merge(Missing.Value);31 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[rowid, 1]).Value2 = m;32

wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[k-1, 2]).Merge(Missing.Value);34 wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[rowid, 2]).Value2 =”'“+ ProjNo;35

wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[k-1, 3]).Merge(Missing.Value);37 wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[rowid, 3]).Value2 =”'“+ projName;下面合并标段列

1//合并标段列 2

index =0;rowid =3;//重置变量 4string pa_name =string.Empty;//标段名称 5for(k =3;k < span> i +2;k++)6 { 7 pa_name = table.Rows[index][”PA_NAME“].ToString();8if(wksheet.get_Range(wksheet.Cells[k, 4], wksheet.Cells[k, 4]).Value2.ToString()== pa_name)9 { 10 wksheet.get_Range(wksheet.Cells[k, 4], wksheet.Cells[k, 4]).Value2 =”“;11continue;12 } 13 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[k-1, 4]).Merge(Missing.Value);14 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[rowid, 4]).Value2 =”'“+ pa_name;15 index = k-3;16 rowid = k;17 k--;18 19 } 20//退出循环时合并最后一个项目的标段 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[k-1, 4]).Merge(Missing.Value);22 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[rowid, 4]).Value2 =”'“+ pa_name;23 tick = DateTime.Now.ToString(”yyyyMMddhhmmss“);24 save_path = temp_path +”“+ tick +”保证金收退情况表.xls“;25 Session[”BailBackID“] = tick +”保证金收退情况表.xls“;26 Session[”_BailBack“] =”true“;27 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);28 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程 29//DownLoad(save_path);30//Page_Close();

当然,上面的操作中会进行好几次循环,在性能方面不太可取,园子里的兄弟也许会有更好的方法,小弟不吝赐教了

下面我们看下几个效果图:

(注意:这里提示的导出数据是指从数据库成功取出数据,还没有操作EXCEL对象,刚开始已经说过了,当然这个提示文字换成其它的也可以)

整个过程采用AJAX提示的,一来不刷新,二来导出时间比较长的话,可以给客户一个良好的体验效果,否可,用户一点导出按钮,半天没反应也没提示,客户就觉得怎么这么慢的,是不是你们程序有问题,指责一大堆,有了这么些交互提示信息,让客户多等几分钟也能承受。

3.生成的表格包含多个sheet的操作,比如下面一种情况

绘制这张表的要求是根据选择某年的几月到几月,生成这个几个月的一个综合情况的sheet,然后分别生成这几个月的单独的sheet表,生成上面表的模板,包含两个sheet,一个综合月份的sheet和一个单独月份的sheet,因为单独月份的sheet表现形式都是一样的,我们可以根据选择的月份个数Copy几个sheet就可以了

Workbooks workbooks = app.Workbooks;2

_Workbook workbook = workbooks.Add(template_path +”招标单位年度招标情况逐月统计表.xls“);4 Sheets sheets = workbook.Worksheets;5 _Worksheet Yearsheet =(_Worksheet)sheets.get_Item(1);6 _Worksheet worksheet =(_Worksheet)sheets.get_Item(2);7if(worksheet ==null)8 { 9return;10 } 11for(int i =1;i < span> monthCount;i++)12 worksheet.Copy(Missing.Value, workbook.Worksheets[2]);//月统计工作薄

Yearsheet的操作就不说了,和前面几个一样操作,关键是月份的sheet的生成,其实就是循环操作get_Item(i),代码如下

1//////////////////////////////////////每月详细统计//////////////////////////////////// 2

3int item_id =2;4 rowNum =0;book_Amount =0;index =0;5 bid_Amount =”“;bidser_Amount =”“;agent_Amount =0;//清空变量 6 _Worksheet ws =null;7for(int i =0;i < span> tableMM.Rows.Count;i++)8 { 9 rowNum++;10 Month = tableMM.Rows[index][”DATE_MONTH“].ToString();11if(tableMM.Rows[i][”DATE_MONTH“].ToString()== Month)12 { 13 ws =(_Worksheet)sheets.get_Item(item_id);14 ws.Cells[3+ rowNum-1, 1] = rowNum;15 ws.Cells[3+ rowNum-1, 2] = tableMM.Rows[i][”PROJNO“];16 ws.Cells[3+ rowNum-1, 3] = tableMM.Rows[i][”PROJNAME“];17 ws.Cells[3+ rowNum-1, 4] = tableMM.Rows[i][”BID_TYPE“];18 ws.Cells[3+ rowNum-1, 5] = tableMM.Rows[i][”BID_MODE“];19 ws.Cells[3+ rowNum-1, 6] = tableMM.Rows[i][”OPENDT“];20 ws.Cells[3+ rowNum-1, 7] = tableMM.Rows[i][”OPENADDRESS“];21 ws.Cells[3+ rowNum-1, 8] = tableMM.Rows[i][”BID_UNIT“];22 ws.Cells[3+ rowNum-1, 9] = tableMM.Rows[i][”NOTICE_NO“].ToString().Replace(”神华国贸“, ”“);23 ws.Cells[3+ rowNum-1, 10] = tableMM.Rows[i][”BOOKAMOUNT“];24 ws.Cells[3+ rowNum-1, 11] = tableMM.Rows[i][”BIDPRICE“] +”(“+ tableMM.Rows[i][”CURRENCY“] +”)“;25 ws.Cells[3+ rowNum-1, 12] = tableMM.Rows[i][”BIDSER_AMOUNT“] +”(“+ tableMM.Rows[i][”CURRENCY“]+”)“;26 ws.Cells[3+ rowNum-1, 13] = tableMM.Rows[i][”AGT_AMOUNT“];27 ws.Cells[3+ rowNum-1, 14] =”“;28 ws.get_Range(ws.Cells[3+ rowNum-1, 1], ws.Cells[3+ rowNum-1, 14]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);29continue;30 } 31

万万32 ws.Cells[1, 1] = year +”年“+ bidName + GetMonth(Month)+”月份招标项目情况一览表“;33

34//每月合计

sql =” SELECT CURRENCY, NVL(SUM(BIDPRICE),0)AS BIDPRICE,NVL(SUM(BOOKAMOUNT),0)AS BOOKAMOUNT,NVL(SUM(BIDSER_AMOUNT),0)AS BIDSER_AMOUNT,NVL(SUM(AGT_AMOUNT),0)AS AGT_AMOUNT FROM IBS_V_BID_MONTHLY_STAT“+ SqlFilter + 36” AND DATE_YEAR ='“+ year +”' AND COMPANY_ID=“+ biderID +” AND DATE_MONTH ='“+ Month +”'“+ 37” GROUP BY CURRENCY“;38 System.Data.DataTable dt1 = OracleHelper.RetDataTable(sql);39for(int m =0;m < span> dt1.Rows.Count;m++)40 { 41 bid_Amount += dt1.Rows[m][”BIDPRICE“] +”(“+dt1.Rows[m][”CURRENCY“] +”)rt“;42 book_Amount +=float.Parse(dt1.Rows[m][”BOOKAMOUNT“].ToString());43 bidser_Amount += dt1.Rows[m][”BIDSER_AMOUNT“] +”(“+ dt1.Rows[m][”CURRENCY“] +”)rt“;44 agent_Amount +=float.Parse(dt1.Rows[m][”AGT_AMOUNT“].ToString());45 } 46

ws.Cells[3+ rowNum-1, 3] =”合 计“;48 ws.Cells[3+ rowNum-1, 10] = book_Amount;49 ws.Cells[3+ rowNum-1, 11] = bid_Amount;50 ws.Cells[3+ rowNum-1, 12] = bidser_Amount;51 ws.Cells[3+ rowNum-1, 13] = agent_Amount;52 ws.get_Range(ws.Cells[3+ rowNum-1, 1], ws.Cells[3+ rowNum-1, 14]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);53 ws.Name = GetMM(Month);54

item_id++;56 index = i;//汇总下一个月份的招标项目 57 i--;58 rowNum =0;book_Amount =0;59 bid_Amount =”“;bidser_Amount =”“;agent_Amount =0;//清空变量 60 } 61

62//跳出循环时进行最后一个月份的项目汇总

用的是oracle数据库,所以上面那个sql语句。。呵呵

上面大致说得就差不多了,因为是不断循环的什么的,可能对于大的数据量读写来说,比较好性能,如果大家有什么更好的方法,可以指点下,为了弥补等待时间过长,所以才结合了AJAX来处理。

万万

最后我把做的一个小demo的链接帖出来给大家,还有一些空模板和对应生成的数据表给大家对照看下,尤其相对复杂一些的表画应该是能画出来的,主要看大家采用什么样的方法,能少循环一次就尽量少循环,呵呵~~~ http:// = ” 8 } 9else

10if(resp.value ==“NO”)11 { 12 $('tipMsg').innerHTML = “没有找到符合该查询条件的数据”;13 $('btnExcel').disabled = false;14 } 15else 16 { 17 $('tipMsg').innerHTML = “警告:导出数据出错”;18 $('btnExcel').disabled = false;19 } 20 21 22 } 1function RedirectUrl()2 { 3 $('tipMsg').innerHTML = “portCallback);5function ReportCallback(resp)6 { 7if(resp.value!=”Error“&& resp.value!=”“)8 {

正在读写报表文件,请稍后

”;

准备导出数据,请稍等

“;7 setTimeout(”RedirectUrl()“,1000);//延时体验

var ajax =new ajax_request(”ExcelReport.aspx?flag=ReportByTemp&“+Math.random(), ”“, ”“, Re 9 $('btnExcel').disabled = false;10 $('tipMsg').innerHTML = ”数据导出成功!“;11 Open(”XLS_DownLoad.aspx?path=“+resp.value);//window.location.href = resp.value;// 12 } 13else 14 { 15 $('btnExcel').disabled = false;16 $('tipMsg').innerHTML = ”文件读写出错,请检查文件模板是否存在或对文件是否有读写权限!";17 } 18 } 19 20 } 21

22function Open(url)23{ 24 window.open(url,'newwindow','height=1,width=1,top=1500,left=1500,toolbar=no,menubar=no,scrollbars=yes,location=no,status=no')25} ExcelReportCallback(resp)原本是一个回调函数,但是里面调用了一个RedirectUrl()方法,这个方法又包含了一个回调函数,这样就形成了回调的嵌套,之所以这么做,是因为,第一个回调是处理从数据库取出数据成功与否,如果成功了跳转到画EXCEL的页面,这样的话会出现一个空白页等生成好后出现下载框,后来觉得是否可以嵌套一个回调来继续一次异步操作,这样就不会出现长时间等待的空白页面了,而是生成好EXCEL后返回地址,或者可以返回一个文件名到XLS_DownLoad.aspx页面直接下载,但是XLS_DownLoad.aspx也是要出现的,我尝试过让下载后这个页面自动关闭,无赖做不到,所以把Open()方法里的数据值调得让页面不显示,但是状态栏还是有显示的。

到这里算是写完了,决定奢侈下,放到首页下:),总觉得首页的文章只有高手才能放,而且放到首页也是一种奢侈,希望对园子里的某些人有一定的帮助吧~~

第二篇:aspnet总结

学习ASP.NET,我是从VFP、ASP转型而来的。

我学习的ASP.NET,走的是asp.net(c#)+Sql2005这条路。

之前学习VFP时,就对数据库是了深刻的了解,对CS结构的项目有了大概的认识与体验。如今学习ASP.NET,速度要比他人快得多,至少更容易上手。

关于这方面的学习,我的重点放在BS结构的网站项目上,我不太喜欢CS结构的程序;因为我觉得,CS结构的程序,要想让别人看到,除非别人知道并拥有您的软件,或者购买您的CS程序,否则,没有人会知道您的程序的。

但是,BS结构的网站程序,就不同了,您可以将您的网站发布到互联网上,这样,就可以让很多的陌生的不知名的可遇不可求的网友来访问您的网站,从而,他们就会知道您的网站程序,这更能充分体现出一个程序的价值所在。

这两者的区别就在于,CS结构的程序,必须安装到任何一个客户端才能使用;而BS结构的程序,只需要配置好服务器,连网的计算机,在随时随地都能打开您的网站;这不仅省去了安装的麻烦,同时更有效的解决了时间和空间的限制、打破资源的局限性,让网站程序的价值得以充分体现出来。

之前我学习ASP,是通过dw学习的,当时,就觉得非常麻烦,尤其是html标签文件与ASP代码,是同放在一个文件里面的,这就产生了大量的冗余的代码,修改的时候觉得非常麻烦,即不容易维护、更不容易修改。看上去,眼睛都花了。

还好,转向ASP.NET的学习,正符合自己的个性思维,在学习的过程中,如鱼得水,仅需要学习一下基本的操作和语法,其它基本没有障碍。

学习了ASP.NET的代码分离模式与无刷新技术,认识到了网站的真正的结构,最终才对BS结构的网站程序有了进一步的认识。

同时,对SQL大型数据库的认识才有了质的改变。

第三篇:aspnet软件开发学习总结

asp.net学习经验总结

通过几个月的学习,我初步掌握ASP.NET开发平台的基本知识,也通过老师的教学,完成了实际项目中的应用。由于大学学习中打下了较为扎实的C#基础,所以在选择开发平台学习时选择了ASP.NET开发平台。ASP.NET是基于网络的交互开发平台,可以通过微软的C#语言以及Visual Studio 2010开发环境进行开发。

在学习ASP.NET之前,对网络交互的开发平台是非常陌生的。并不知道如何才能实现网站的开发和实现。通过ASP.NET的学习,我成功的使用WEB2.0和MVC2.0两种架构模式分别开发了资讯类网站和商务类网站。下面我将对开发过程的学习进行总结。

首先是资讯类网站的开发,选择使用了方便入手的web2.0架构平台。Web2.0以逻辑上的表示层、数据访问层、业务逻辑层。通过三层架构间函数的调用,可以增加系统的安全性,也可以提高代码的可读性。通过对资讯类网站的开发我逐渐熟悉了ASP.NET的开发过程以及交互模式,通过与ADO.NET的配合使用,完成了与数据库的交互工作。半个月的时间初步完成了资讯类新闻网的开发工作,实现了用户注册、登录,分栏目显示图文新闻信息,点击查看详情。后台实现了对用户角色的管理以及新闻的管理、编辑、上传工作。较完整的理解了ASP.NET中WEB2.0架构的基本开发过程。对三层架构有了初步的理解和认识。接下来的时间我学习了使用MVC2.0开发商务网站。MVC同样是三层架构模型。与WEB开发架构的主要区别在于,MVC是物理上的三层架构,而WEB是逻辑上的三层架构。MVC解放了路由机制,使得页面的交互速度大幅提高。通过访问controler层,调用DAL层函数,使用MODEL层存储数据,使用DBHELPER类中的通用方法,实现参数的传递,以及与数据库的交互,最终将参数返回到VIEW层,实现页面的显示。MVC架构的开发优势在于,给了程序员绝对的自由,可以通过JS、JQ写出各种需要的显示效果,页面的可读性和自由性也大大提高。同时,MVC也兼顾了WEB的优点,方便了代码的模块化传递,增加代码的复用性,提高代码的可读性。通过一个半月的开发工作,我成功实现了商务网站的基本功能,实现了支付接口,前台的注册登录,商品展示、购买。后台的订单管理,用户管理以及角色授权等功能。

通过学习ASP.NET我基本熟悉了网站的开发模式、架构以及开发流程,通过实际项目的演练,也让我能够将大学学习中的理论运用到实践。现阶段所需要的就是继续加深C#的学习深度,了解JS、JQ库的写作规范,争取能够尽早使用自己编写的JS库完成个人网站的建设开发工作。很感谢成都华育国际的老师和同学在这几个月时间里给我的帮助,让我能够在ASP.NET的开发中达到入门水平。希望通过自身的努力,将自己的技术进一步提高。

第四篇:告别烦恼青春飞扬

告别烦恼青春飞扬

———靠山中学八年五班心里主题班会方案

活动地点:靠山中学八年五班教室

活动时间:2010 6 8

活动背景

学生走进初二,面临着社会家庭和学校给予的太多的学习压力的同时,生理及心理也发生了很大变化,学生有太多的困惑,扰乱了他们的正常生活。在这样的前提下,我们召开了此次班会,希望全体同学们从班会中有所感悟,有所收获,摆脱困境,轻松快乐的走进初三。

活动目的1.正确面对考试,积极向上,寻找正确的学习方法。

2.男女生正常交往,纯真的友谊最美好。

3.体会父母的良苦用心,与父母常沟通。

活动准备活动

1.收集班级事例

活动过程

本次班会共三大版块:

第一版块:中学生活的困惑

1.开场白

2.心理剧《请你帮帮我》

3.心理小组解惑

第二版块:走出青苹果乐园

1.《一位男生的独白》

2.辩论《男女生是否可以交往》

3.诗朗诵《我为少男少女歌唱》

4.成长誓言

第三版块:走不出的港湾

1.一位男生的苦恼

2.解惑,讲述与父母亲的真实故事

3.共唱《感恩的心》

活动总结及效果分析

本次班会,收到的效果非常好,是一堂成功的班会,因为每位同学都热情洋溢的参与,所有的事例与讲谈,绝对是从他们内心真切涌出,达到了情感共鸣。心理班会的目的就是能在孩子们的心灵上激起一层涟漪送去一份养分,而这次班会达到了。真心希望同学们在班会中有所思有所悟,摆脱困惑,快乐地生活,轻松地学习。

第五篇:告别计算错误的烦恼

告别计算错误的烦恼——快乐学数学

在小学数学计算教学和解题过程中,计算错误常常困扰着教师和学生。如:在计算时,学生不是看错数字,就是写错数字;不是抄错数字,就是漏写符号;不是加法忘了进位,就是减法忘了退位;不是加法当乘法做,就是计算顺序颠倒;甚至会出现一些无法理解的错误。错误发生后,学生懊悔,老师责备,家长埋怨。

怎样减少小学生的计算错误,提高计算的准确率,让学生快乐轻松学数学呢? 对于学生计算中的错误,我们不能以“马虎”、“粗心大意”一言以避之。我们只有透过计算错误现象查找错误的原因和本质,对症下药,才能让我们的学生彻底纠正计算中出现的错误,快乐学数学。下面,我就结合自己的

教学实践谈谈学生计算错误的类型、错误成因及解决途径。

一、小学生计算错误的类型

计算错误错误通常是指计算结果不正确。由于学生千差万别,个体之间存在着很大的差异性,因此学生出现的计算错误也各不一样。我归纳了一下,计算错误大体有以下几种类型:

1、感知性造成的错误——误认

误认是学生在认读数字过程中造成的错误。主要是由于学生做作业三心二意不专心,没有认真细致的审题习惯造成的一种错误。这种错误有两种类型,一种是认错了数字,如:计算53-18正确结果应该是35,而往往得出错误结果17或45,得出前一个结果的原因是把53误认成35,得出45的原因是没有退位(有时,加法没有进位);另一种是认错符号,如:口算5×4的正确结果是20,而写成9,原因是把运算符号看错了。

2、意志品质问题造成的错误——误写 误写也叫笔下误,就是本来计算正确,但在写答案结果时出现了脑中想的和手上写的不相符笔误而产生的错误。如:在计算148÷4时,竖式计算正确得结果37,而在横式上忘记写结果或写成73。如:在137÷3时,竖式计算正确,横式写成:137÷3=46,那就可能有两种情况:要么是忘了写余数,要么就是不知道写余数。

3、技能性错误——误算

误算是指在计算过程中出现的错误。这种错误通常有以下几种情形:

(1)算理错误。学生没有掌握正确的算理和计算法则,而导致计算错误。例如:把5÷5=1错算成5÷5=0,把3×0=0错算成3×0=3,把3+5×4=23错算成3+5×4=32,把30-8÷2=26错算成30-8÷2=11,把1/2+1/3=5/6错算成等于2/5,把3.25÷0.5=6.5错算成等于65等。

(2)口算有误。口算有误就是学生在笔算时,运用口算列式计算相加、减、乘或除时出现错误。如:计算368×56不是得出正确结果20976,而得出错误结果20966就属于这种情况。

4、思维定势错误——误判

定势错误是学生对已学的知识已真正掌握了,却未能准确、熟练的运用而造成的错误。有些题目鲜明突出,易在脑中留下较深刻的印象,形成较强的信息,产生定势作用,这种思维定势会使学生的正确思维受到干扰。特别是简便运算,当碰到与强信息相类似的外来信息时,原有的强信息被激活,产生思维干扰。如当学生计算400÷25×4,就有学生计算成400÷25×4=400÷100=4。分析其原因,25×4=100是一个强信息,这一强信息抑制了学生在同级计算中按从左往右的顺序依次计算的法则的正常运用,造成计算错误(表面上看像运算法则应用错误,实际上是思维定势错误);又如2.8×3.3+2.8×5.7,象这类题在运用乘法分配律时括号里面的两数之和一般是整

十、整百或整千数,这是一个强信息,受其干扰,学生就会算成2.8×3.3+2.8×5.7=2.8×(3.3+5.7)=2.8×10=28。这些都是思维定势产生的错误。

造成这些计算错误的原因是什么,我们如何帮助学生解决?

二、小学生计算错误的原因分析及解决途径

1、对于感知性造成的错误——误认

造成这种错误主要是受小学生本身的年龄、个性、兴趣、理解能力、知识水平等方面的因素影响,他们的注意不稳定,不持久,注意的范围不广,易被无关因素吸引而出现“分心”现象,常常会出现顾此失彼,丢三落四。

解决办法:一是加强有意注意的培养,训练注意分配能力,提高注意能力;二是培养学生认真细致的学习习惯,提高认读的正确率;三是教师作业要合理设计和安排,避免重复的机械训练。

2、对于意志品质问题造成的错误——误写

这种错误主要是没有认真审题造成的。对于这种错误,我们要从源头抓起,要他们多读题,培养学生认真细致的审题习惯(开始1题读至少3遍,把计算结果与横式结果对照检查,随着审题能力的提高,以后逐渐减少。)。

3、对于技能性错误——误算

这种错误主要是学生在小学数学计算学习中,没有把数的概念和运算法则掌握好,理解得不够透彻,还有就是缺乏扎实的基础知识和熟练的基本口算技能。

解决办法:一是要加强计算的概念认识,让他们熟练掌握运算定律和法则;二是要加强口算能力的培养,提高口算的质量;三是要加强估算能力的培养,提高运算速度和准确率;四是要强化养成教育,使学生养成验算检查的好习惯。

4、对于思维定势错误——误判

思维定势从积极的一面来看,能使学生借助以往的经验,促使问题得以迅速解决。从消极得一面来看,也往往导致思维的僵化,不能适应变化了的情况,阻碍了多角度的灵活思维的发展,而仍按原有的思维方式考虑问题,从而导致错误的发生。

解决办法:设计针对性练习,排除干扰因素。我们都知道小学数学中有许多计算既有联系又有区别,因此在计算教学过程中,教师要注意根据学生的实际情况设计一些针对性练习,以便排除各种干扰,充分利用定势的积极一面,克服消极影响,提高计算的正确率。其中,对教学中学生容易忽略的环节,应作必要的突出,或采用反例,进行专项训练或对比辨析,以保证开始就让学生形成正确鲜明的印象,力求减少因定势而产生的失误。

莎士比亚在《理查二世》一文中说过这样的一句话:容忍祸根乱源而不加纠正,危险已是无可避免的。对于学生计算中的错误,我们不能以“马虎”、“粗心大意”一言以避之。在教学过程中,我们要认真找出学生计算中出现错误的原因,对症下药,采取相应的措施,防止和纠正学生计算中错误的发生,让计算错误的烦恼不再来,让学生享受数学学习的乐趣,轻松学数学。

下载告别ASPNET操作EXCEL的烦恼(总结篇)word格式文档
下载告别ASPNET操作EXCEL的烦恼(总结篇).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    ASPNET开发注意问题总结

    ASP.NTE开发 web pages 什么是 Razor ? Razor 是一种将基于服务器的代码添加到网页中的标记语法 Razor 具有传统 ASP.NET 标记的功能,但更容易使用并且更容易学习Razor 是一......

    关于告别烦恼作文[共5篇]

    关于告别烦恼作文在日常学习、工作抑或是生活中,大家总少不了接触作文吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。相信许多人会觉得作文很难写吧,下......

    同学聚会感言-告别篇

    同学聚会感言之 ——挥手阔别,再次相约 伴随着欢声笑语和载歌载舞,十年一次的同学聚会在这里就暂告一段落了。大家收拾好行李,十年之后即将再次挥手阔别这片饱含丰富情感的热......

    告别陋习总结

    告别陋习总结细微之处见精神,举止之间显文明,为创造洁净、文明、安全、和谐校园环境,培养学生良好的文明行为和学习习惯,我班在学校政教处统一布置下开展了“告别陋习,做文明学生......

    爬杆操作总结[精选多篇]

    爬杆操作总结 爬杆练习,在爬杆是过程中,使我了解到了爬杆的一些知识,学会了如何使用爬杆鞋的正确穿着和安全带的正确使用方法,也深深的体会到了高空作业的不易和艰辛,但这些都是......

    似水年华——青春告别篇

    似水年华——青春告别篇 抱歉!我重新看过文章后,还发现有错误。于是就再改了一遍(这篇最后改完的情况,但大体内容没变,主要是改错字和标点符号)。 似水年华 ——青春告别篇 初夏,独......

    老师告别学生演讲稿篇[合集]

    演讲的本质在于“讲”,而不在于“演”,它以“讲”为主、以“演”为辅。由于演讲要诉诸口头,拟稿时必须以易说能讲为前提。以下是小编精心收集整理的关于老师告别学生演讲稿篇,下......

    有关告别童年作文[精选多篇]

    有关告别童年作文8篇无论在学习、工作或是生活中,大家都经常看到作文的身影吧,作文是经过人的思想考虑和语言组织,通过文字来表达一个主题意义的记叙方法。那要怎么写好作文呢?......