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

合集下载

Net操作Excel(终极方法NPOI)

Net操作Excel(终极方法NPOI)

Net操作Excel(终极⽅法NPOI)前⾔/C#操作Excel已经是⽼⽣长谈的事情了,可下⾯我说的这个NPOI操作Excel,应该是最好的⽅案了,没有之⼀,使⽤NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的⽂件,⽀持的⽂件格式包括xls, doc, ppt等。

NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel⽂档进⾏读写操作。

⽅法导出代码:erModel.HSSFWorkbook book = new erModel.HSSFWorkbook();erModel.ISheet sheet = book.CreateSheet("test_01");// 第⼀列erModel.IRow row = sheet.CreateRow(0);row.CreateCell(0).SetCellValue("第⼀列第⼀⾏");// 第⼆列erModel.IRow row2 = sheet.CreateRow(1);row2.CreateCell(0).SetCellValue("第⼆列第⼀⾏");// ...// 写⼊到客户端System.IO.MemoryStream ms = new System.IO.MemoryStream();book.Write(ms);Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyyMMddHHmmssfff")));Response.BinaryWrite(ms.ToArray());book = null;ms.Close();ms.Dispose();导⼊代码:HSSFWorkbook hssfworkbook;#regionpublic DataTable ImportExcelFile(string filePath){#region//初始化信息try{using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)){hssfworkbook = new HSSFWorkbook(file);}}catch (Exception e){throw e;}#endregionerModel.Sheet sheet = hssfworkbook.GetSheetAt(0);System.Collections.IEnumerator rows = sheet.GetRowEnumerator();DataTable dt = new DataTable();for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++){dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());}while (rows.MoveNext()){HSSFRow row = (HSSFRow)rows.Current;DataRow dr = dt.NewRow();for (int i = 0; i < stCellNum; i++){erModel.Cell cell = row.GetCell(i);if (cell == null){dr[i] = null;}else{dr[i] = cell.ToString();}}dt.Rows.Add(dr);}return dt;}#endregionC#导出Excel:public static void WriteExcel(DataTable dt, string filePath){if (!string.IsNullOrEmpty(filePath) && null != dt && dt.Rows.Count > 0){erModel.HSSFWorkbook book = new erModel.HSSFWorkbook();erModel.ISheet sheet = book.CreateSheet(dt.TableName);erModel.IRow row = sheet.CreateRow(0);for (int i = 0; i < dt.Columns.Count; i++){row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);}for (int i = 0; i < dt.Rows.Count; i++){erModel.IRow row2 = sheet.CreateRow(i + 1);for (int j = 0; j < dt.Columns.Count; j++){row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));}}// 写⼊到客户端using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){book.Write(ms);using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)){byte[] data = ms.ToArray();fs.Write(data, 0, data.Length);fs.Flush();}book = null;}}}结论这样就很简单的解决Excel的操作了,⼤家可以试试,很好⽤,如果觉得对您有⽤请推荐⼀下,谢谢。

.net操作Excel的权限问题

.net操作Excel的权限问题

中Excel操作权限的问题问题1:近日在打开原来写的一个网页程序运行时,出现了Excel操作权限的问题,具体的说就是在代码中调用下面这段与Excel操作有关的语句时,Application curExcelApp = new ApplicationClass();提示权限不足,具体的提示内容如下:检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误:80070005。

说明:执行当前Web请求期间,出现未处理的异常。

请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息:System.UnauthorizedAccessException:检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误:80070005。

未被授权访问所请求的资源。

请考虑授予 请求标识访问此资源的权限。

有一个在应用程序没有模拟时使用的基进程标识(通常,在IIS5上为{MACHINE}\ASPNET,在IIS6上为网络服务)。

如果应用程序正在通过模拟,则标识将为匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户。

要将 访问权限授予某个文件,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。

单击“添加”添加适当的用户或组。

突出显示帐户,选中所需访问权限对应的框。

源错误:行533: //创建Excel信息行534: object missing = System.Reflection.Missing.Value;行535: Application curExcelApp = new ApplicationClass();行536: curExcelApp.Application.DisplayAlerts = false;行537: Workbook curWorkBook = curExcelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);原来碰到过这种情况,知道是由于Excel的DCom组件权限不足所引起的,所以按照原来的步骤进行设置,如下所示:1、在服务器上安装office的Excel软件;2、在“开始”->“运行”中输入dcomcnfg.exe启动“组件服务”;3、依次双击“组件服务”->“计算机”->“我的电脑”->“DCOM配置”;4、在“DCOM配置”中找到“Microsoft Excel应用程序”,在它上面点击右键,然后点击“属性”,弹出“Microsoft Excel应用程序属性”对话框;5、点击“标识”标签,选择“交互式用户”;6、点击“安全”标签,在“启动和激活权限”上点击“自定义”,然后点击对应的“编辑”按钮,在弹出的“安全性”对话框中填加一个“NETWORK SERVICE”用户(注意要选择本计算机名),并给它赋予“本地启动”和“本地激活”权限。

net的Excel解决方案

net的Excel解决方案

在:Microsoft Office Excel 工作表上操作具体解决方法如下:1:在服务器上安装office的Excel软件.2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框5:点击"标识"标签,选择"交互式用户"6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORKSERVICE"用户,然后赋予"本地访问"权限.这样,我们便配置好了相应的Excel的DCOM权限.注意:这是在WIN2003上配置的,在2000,xp上,是配置ASPNET用户由于EXCEL是在服务器上打开的,所以应该写一个把导出数据保存在服务器上,然后再传递给客户端的方法,最后每次调用这个功能的时候再删除以前在服务器上所生成的所有Excel。

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

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

Copy From 告别操作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 {45 DataView dv = Cache["ReportByTemp"] as DataView;6//建立一个Excel.Application的新进程7 Excel.Application app =new Excel.Application();8if (app ==null)9 {10return;11 }12 app.Visible =false;13 erControl =true;14 Workbooks workbooks = app.Workbooks;15 _Workbook workbook = workbooks.Add(template_path +"\\EXCEL测试模板.xls");//这里的Add方法里的参数就是模板的路径16 Sheets sheets = workbook.Worksheets;17 _Worksheet worksheet = (_Worksheet)sheets.get_Item(1);//模板只有一个sheet表18if (worksheet ==null)19 {20return;21 }2223int 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].T oString();29 worksheet.Cells[3+ i, 3] = dv[i].Row[1].T oString();3031 excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]); //黑体32 excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells [3+ i, 3]);//居中33 worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Col or = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);3435 }3637 tick = DateTime.Now.Ticks.ToString();38 save_path = temp_path +"\\"+ tick +".xls";39 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Va lue, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Valu e, Missing.Value, Missing.Value);40 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程4142 }43break;44#endregion效果如下:2. 不读模板的话,调用的时候其实会继承一个空白模板,然后写入数据,程序画表头,最终达到一样的效果,程序如下:1#region不使用模板生成Excel表2case"ReportByNone":3 {45 DataView dv = Cache["ReportByNone"] as DataView;6//建立一个Excel.Application的新进程7 Excel.Application app =new Excel.Application();8if (app ==null)9 {10return;11 }12 app.Visible =false;13 erControl =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 }2223 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 3]).Merge(Missing.Val ue); //横向合并24 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] );//居中27 excelOperate.SetBgColor(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], Syst em.Drawing.Color.Red);//背景色28 excelOperate.SetFontSize(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 16); //字体大小29 excelOperate.SetRowHeight(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 3 2.25);//行高30 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Borders.Color = Sy stem.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色连续边框3132 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 = Sy stem.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], Syst em.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].T oString();45 worksheet.Cells[3+ i, 3] = dv[i].Row[1].T oString();4647 excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]); //黑体48 excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells [3+ i, 3]);//居中49 worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Col or = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//设置边框颜色,不然打印预览,会非常不雅观5051 }52 excelOperate.SetColumnWidth(worksheet, "A", 10);53 excelOperate.SetColumnWidth(worksheet, "B", 20);54 excelOperate.SetColumnWidth(worksheet, "C", 20);55 ="导出EXCEL测试一";5657 tick = DateTime.Now.Ticks.ToString();58 save_path = temp_path +"\\"+ tick +".xls";59 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Va lue, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Valu e, Missing.Value, Missing.Value);60 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程6162 }63break;6465#endregion效果如下:以上我给了两个最简单的操作说明,下面详细说一下对于一些稍微复杂的报表的生成处理二. 对于复杂的EXCEL报表的生成处理,无非是纵向合并相同的数据行及嵌套纵向合并等一些操作,下面就几个具有针对性的报表作下说明.1.要生成相对复杂的EXCEL表,在从数据库取数据时,要注意先按照合理的要求排好序,有时候可能order by后面要跟好几个字段,而且这几个字段谁先谁后也要注意,因为这些会直接影响报表呈现的效果,比如你的EXCEL表要按月份统计国内外的项目,显示出来的时候要多个项目相同的人连续,那么排序就可能要这样order by 月份,项目类别,用户ID,项目ID(这是写好的视图,基于视图来检索的),这个排序的字段顺序就不能变了,变了的话就不太好生成想要的形式了,如下图:这个也是动态画的,用了个简单的模板,模板就一个表头,没多大意义,除非表头很复杂而且在列表中不需要重画,考虑模板就比较好,向上面那个一月份国际的和其它月份的都是需要重画表头的。

aspNet在IIS下操作Excel文件权限不足的解决方法

aspNet在IIS下操作Excel文件权限不足的解决方法

在IIS下操作Excel文件权限不足的解决方法.NET导出Excel遇到的80070005错误的解决方法:检索COM 类工厂中CLSID 为{00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005基本上.net导出excel文件,都需要如此配置一下,不配置有的时候没错,而配置后基本应该不会出错。

具体配置方法如下:1:在服务器上安装office的Excel软件.2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框5:点击"标识"标签,选择"交互式用户"6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限.8.如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。

在ASP.NET中进行EXCEL开发

在ASP.NET中进行EXCEL开发

在中进行EXCEL开发在 中进行 EXCEL 开发在显示大量数据的时候,使用 EXCEL 无疑是一个很好的选择,以网格为基本的数据单元,配合上众多的计算公式和颜色、线条可以组成功能强大而美观的数据报表。

在现代企业中,这种应用也是最为广泛的。

因此在 Web 项目中,生成并输出 EXCEL 报表也成了非常常见的功能。

但是,在 中使用 EXCEL 却一直存在着以 EXCEL 进程无法释放为代表的几个比较讨厌而且难于解决的问题,在这篇文章中将给出完整的解决方案。

其中包含以下几个方面:开发环境配置DCOM在 中进行 EXCEL 编程优化 EXCEL 的执行效率在 Web 项目中使用 EXCEL 的其他方案本文使用了下列技术:.NET、C# 或 Visual Basic .NET、Visual Studio .NET、EXCEL 本页内容开发环境本文讨论的是在 中使用 Microsoft Excel Object Library 进行开发的过程,开发环境的配置如下:Windows 2000 + SP4Office XP + SP1Visual 2003注意:在这里,请确认一下你的操作系统和Office 的版本,包括补丁的版本。

虽然在绝大多数情况下Windows2000/WindowsXP、Office2000/OfficeXP 的任意组合都能正常工作,但也确实存在同样的代码在仅仅是SP版本不同的两台机器上一个执行正常,而另一个却出现异常的情况。

所以,强烈建议使用与服务器环境完全一致的开发环境。

配置DCOM对Excel 进行编程,实际上就是通过 .Net Framework 去调用Excel 的 COM 组件,所有要在 Web 环境下调用 COM 组件的时候,都需要对其进行相应的配置。

很多朋友都反映在Windows 环境下调试正常的程序,一拿到Web 环境中就出错,实际上就是因为缺少了这一步。

下面就详细介绍 DCOM 的配置过程。

asp心得体会(心得体会,asp)

asp心得体会(心得体会,asp)

asp心得体会(心得体会,asp)第一篇:asp心得体会学习体会asp学习心得一、准备工作首先,学习asp要有些基本的编程知识.最好先学过点vb java最好因为asp不是一门编程语言而是一个web编程框架.他是利用脚本(vbscript javascript)语言做为编程语言的.如果你不会他们那么至少得会点c.c也不会的话建议你先学下c,虽然并不是一定要先学过编程语言,但是学他对这个的学习是有莫大的好处的.在中,整张web页是放在一张大表单里面的。

如:********网页的具体内容??在这个表单内可能放置了很多html控件如按钮、下拉菜单、文本框等。

提供了一些服务器端web控件。

在服务器上执行的时候,通过一定的条件,web窗体将这些服务器web控件转换为普通的html控件。

比如一个按钮:经过转换后就变成了:在中,一个web窗体被看成了一个对象。

它的数据成员就是那些web控件和你自己定义的变量,它的函数成员就是那些用来响应客户端操作的函数,当然还有你自己定义的函数。

我大致讲一下用户请求一张web页的时候发生了一些什么事件:首先,用户第一次请求页面时,先执行web页的page_init过程,在这里通常对组件进行初始化。

然后执行page_load过程,在这里,我们可以做一些初始化的工作。

比如:设定标签控件的文本为:“初始”。

然后,由于用户是第一次请求页面,所以没有什么其他事件发生。

程序控制转为解释执行html代码页中的服务器代码。

在html中,有一个这就是我们的标签控件。

因为我们在page_load过程中对标签的文本赋值了,所以现在程序在将转换为初始。

而按钮的转换就类似于上面我已经说过内容。

经过这些转换以后,html页内的代码变成了标准的代码。

然后,这些代码被用户浏览器得到了。

经过解析后,用户就可以看到一个“初始”和一个按钮。

现在,用户对着按钮点击了一下。

于是,表单就提交了。

(提交的细节,我下面再说)通过提交的表单,服务器得知这是用户点击了按钮控件。

记录一次NPOI操作Excel的掉坑经历

记录一次NPOI操作Excel的掉坑经历

记录⼀次NPOI操作Excel的掉坑经历在⼯作中遇到⼀个需求,需要使⽤ NPOI导出⼀个Excel⽂件,需求很简单,调⽤⼀个已经编辑好的.xlsx⽂件,然后往对应的单元格中填⼊数据,然后保存成⼀个新的.xlsx⽂件即可。

但是实际操作中遇到⼀下⼏个问题。

问题⼀:导出的数据原本是Number格式的,但是到了Excel中,成为了以⽂本格式保存的数字解决⽅案:1. 设置单元格的Type为Numeric2. 设置的值必须是Numeric格式的cell.SetCellType(CellType.Numeric);cell.SetCellValue(Convert.ToDouble(value.Split('~')[0]));问题⼆:导出到Excel模板后Excel单元格内的公式⽆效解决⽅案:sheet.ForceFormulaRecalculation = true;//强制Excel计算公式问题三:设置的单元格颜⾊⽆效解决⽅案:这个不知道原因,可能是NPOI的⼀个Bug,或者是因为我没找到正确的⽤法,ICellStyle style = hwk.CreateCellStyle();style.FillForegroundColor = 10;style.FillPattern = FillPattern.SolidForeground;cell.CellStyle = style;不管是XSSFWorkbook还是HSSFWorkbook这两个对象,设置单元格的代码都如上,但是,XSSFWorkbook怎么样都⽆法设置成功,找了很多⽂档,都不成功,最后改成使⽤HSSFWorkbook就正常了,但是需要把模板修改为.xls格式,同时导出的⽂件也应该是.xls格式的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Copy From 告别操作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 {45 DataView dv = Cache["ReportByTemp"] as DataView;6//建立一个Excel.Application的新进程7 Excel.Application app =new Excel.Application();8if (app ==null)9 {10return;11 }12 app.Visible =false;13 erControl =true;14 Workbooks workbooks = app.Workbooks;15 _Workbook workbook = workbooks.Add(template_path +"\\EXCEL测试模板.xls");//这里的Add方法里的参数就是模板的路径16 Sheets sheets = workbook.Worksheets;17 _Worksheet worksheet = (_Worksheet)sheets.get_Item(1);//模板只有一个sheet表18if (worksheet ==null)19 {20return;21 }2223int 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].T oString();29 worksheet.Cells[3+ i, 3] = dv[i].Row[1].T oString();3031 excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]); //黑体32 excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells [3+ i, 3]);//居中33 worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Col or = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);3435 }3637 tick = DateTime.Now.Ticks.ToString();38 save_path = temp_path +"\\"+ tick +".xls";39 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Va lue, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Valu e, Missing.Value, Missing.Value);40 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程4142 }43break;44#endregion效果如下:2. 不读模板的话,调用的时候其实会继承一个空白模板,然后写入数据,程序画表头,最终达到一样的效果,程序如下:1#region不使用模板生成Excel表2case"ReportByNone":3 {45 DataView dv = Cache["ReportByNone"] as DataView;6//建立一个Excel.Application的新进程7 Excel.Application app =new Excel.Application();8if (app ==null)9 {10return;11 }12 app.Visible =false;13 erControl =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 }2223 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 3]).Merge(Missing.Val ue); //横向合并24 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] );//居中27 excelOperate.SetBgColor(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], Syst em.Drawing.Color.Red);//背景色28 excelOperate.SetFontSize(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 16); //字体大小29 excelOperate.SetRowHeight(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 3 2.25);//行高30 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Borders.Color = Sy stem.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色连续边框3132 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 = Sy stem.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], Syst em.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].T oString();45 worksheet.Cells[3+ i, 3] = dv[i].Row[1].T oString();4647 excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]); //黑体48 excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells [3+ i, 3]);//居中49 worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Col or = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//设置边框颜色,不然打印预览,会非常不雅观5051 }52 excelOperate.SetColumnWidth(worksheet, "A", 10);53 excelOperate.SetColumnWidth(worksheet, "B", 20);54 excelOperate.SetColumnWidth(worksheet, "C", 20);55 ="导出EXCEL测试一";5657 tick = DateTime.Now.Ticks.ToString();58 save_path = temp_path +"\\"+ tick +".xls";59 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Va lue, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Valu e, Missing.Value, Missing.Value);60 excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程6162 }63break;6465#endregion效果如下:以上我给了两个最简单的操作说明,下面详细说一下对于一些稍微复杂的报表的生成处理二. 对于复杂的EXCEL报表的生成处理,无非是纵向合并相同的数据行及嵌套纵向合并等一些操作,下面就几个具有针对性的报表作下说明.1.要生成相对复杂的EXCEL表,在从数据库取数据时,要注意先按照合理的要求排好序,有时候可能order by后面要跟好几个字段,而且这几个字段谁先谁后也要注意,因为这些会直接影响报表呈现的效果,比如你的EXCEL表要按月份统计国内外的项目,显示出来的时候要多个项目相同的人连续,那么排序就可能要这样order by 月份,项目类别,用户ID,项目ID(这是写好的视图,基于视图来检索的),这个排序的字段顺序就不能变了,变了的话就不太好生成想要的形式了,如下图:这个也是动态画的,用了个简单的模板,模板就一个表头,没多大意义,除非表头很复杂而且在列表中不需要重画,考虑模板就比较好,向上面那个一月份国际的和其它月份的都是需要重画表头的。

相关文档
最新文档