告别ASPNET操作EXCEL的烦恼(总结篇)
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的权限问题

中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解决方案

在: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的烦恼(总结篇)

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文件权限不足的解决方法

在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开发

在中进行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要有些基本的编程知识.最好先学过点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⽂件,需求很简单,调⽤⼀个已经编辑好的.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格式的。
asp操作Excel的方法

大中小
楼主
asp 操作Excel的方法 之前java用jxl ,.net 就不用说了。 现在用easp做个web 站点,类似商城的,其中有个需求是要求对以选中的商品进行exce l 导出操作。还有一个需求是用户不想逐条后台添加商品,想要直接导入excel 文件,然 后程序按字段读取后更新。 一、 这个站点最初的版本很有意思,excel 的导出实际上是csv格式的文件,这个比较好办, 生成文本逗号分隔即可。缺点是没有格式。 而批量上传则是在服务器端做存储过程,用vb写了个客户端工具。用户需要先将数据录 入mdb 数据库,然后通过客户端工具“上传”。 二、 对于导出excel 的功能。第一次改动是将csv文件改为html 格式,并更改后缀为xls 。 这样改完之后可以用excel 打开,模板也可以任意调整。但office2003 以上版本打开该文 件时会弹出安全提示:要打开的文件实际类型与后缀不符。虽然不影响最终阅读,但很 不人性化。 三、 既然是微软的excel ,那么就继续尝试,安装了微软的owc 组件。通过owc 组件进行exce l 文档生成,没想到的是,微软的owc 生成的,竟然是标准的xml格式,和第二次改动一 样,只是改了个后缀。这样一来,效果和上面是一样的,也会产生安全提示。 由于效果不好,这个代码也就不贴了。网上有很多,有需要的自己搜索。 四、 接下来,查阅了大量资料之后使用了一个方法,就是通过web 直接调用excel 的com组件 进行文件读写操作。本质上讲,这个和用office 软件打开excel 文件是一样的,因此生成 的效果很好。但是由于是直接调用com组件,因此需要在服务器上有相应权限。使用这 个方法,在操作excel 的时候,服务器的进程中会出现excel.exe 的进程,而且在发生某
ASP NET错误处理方法归结

错误处理方法归结(方法1):page_error 事件最近接触这方面的知识比较多,从网上搜集了些资料,总结出来,供大家参考,有不妥的地方,还请大家多多指正。
言归正传, 提供了三种用于在出现错误时捕获和响应错误的主要方法:page_error 事件、application_error 事件以及应用程序配置文件(Web.config)。
这三种方法的主要作用无非是创建自定义的错误报告,创建自定义错误报告的作用无非是:出于安全方面的考虑,还有就是为了向用户展示友好的错误页面,提高程序的友好性。
话不多说,首先介绍提供的第一种错误处理方法:Page_Error 事件,现举例说明如下:Page_Error 事件提供了一种捕获页面级错误的方法。
对于错误的处理,您可以只是显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。
备注:此示例在浏览器中显示了详细的错误信息,提供此示例只是为了进行说明。
向应用程序的最终用户展示出错的详细信息是非常危险的(尤其是web程序)。
更适当的做法是向用户显示一条消息,告知其已发生错误,然后将具体的错误信息记录在事件日志中。
本例是在Page_Load事件中有意引发一个空异常来测试Page_Error 事件的。
举例:创建web程序—新建页面PageEvent.aspx,然后将以下代码添加到PageEvent.aspx中:<script language="C#" runat="server">void Page_Load(object sender, System.EventArgs e){// 引发“空引用”异常throw (new ArgumentNullException());}public void Page_Error(object sender, EventArgs e){Exception objErr = Server.GetLastError().GetBaseException(); // 获取错误string err = "1.error in: " + Request.Url.ToString() + "</br>" +"2.error Message: " + objErr.Message.ToString() + "</br>" +"3.stack Trace: " + objErr.StackTrace.ToString() + "</br>";Response.Write(err.ToString()); //输出错误信息// Response.Redirect("ErrorPage.htm"); //可以重定向到友好的错误页面Server.ClearError();}</script>保存,右击该页面—“在浏览器中查看”,即可看到捕获到的自定义错误信息。
[Asp.net]C#操作Excel的几种方式优缺点比较
![[Asp.net]C#操作Excel的几种方式优缺点比较](https://img.taocdn.com/s3/m/b4e22e1ccd7931b765ce0508763231126edb77f9.png)
[]C#操作Excel的⼏种⽅式优缺点⽐较在项⽬中我们常常需要将数据库中的数据导出成Excel⽂件有⼀次⼯作中我的⽬的就是读取Excel到内存中,整理成指定格式整理后再导出到Excel。
因为我要处理的每个Excel表格⽂件很⼤。
⼀个表格多个sheet,每个sheet-⼀千到上W⾏不等。
列数超过300列。
所有在这⾥我将在使⽤⼀些处理Excel的⽅法的时候,所遇到的⼀些问题记录下来,也做⼀个⼤致的⽐较。
主要是针对此次数据处理NPOI⽬前⽐较流⾏的⼀款操作Excel的组件。
移植于Java的POI,是⼀个开源项⽬,对Excel的操作很全⾯。
官⽹优势:1、免费2、机器不⽤安装Office也可以直接操作Excel,免去很多事。
3、现在已⾄此的⽂件格式包括Excel2003和2007之后的xls,xlsx以及docx。
4、⽀持⽂件的导⼊和导出5、⽹上有丰富的实例代码,遇到基本的问题可以上⽹参考⽹友的解决⽅法。
6、NPOI能⽀持绝⼤多数Excel⾥⾯的功能操作(Excel内的公式函数、设置单元格的格式样式)7、导⼊导出速度快。
内存占⽤⼤。
特定优势:⽀持读取超过256列的Excel表格。
缺点:参考⽬前很多⽹上的⽂档,npoi导出xlsx,使⽤ XSSFWorkbook 使⽤ Write ⽅法写⼊内存流后,返回的 MemoryStream 已经被关闭了,不能再使⽤了。
你需要花⼀点时间解决这个问题。
可以参考:xlsx格式导出推荐使⽤Epplus组件NPOI辅助类:1 using System;2 using System.Collections;3 using System.Collections.Generic;4 using System.Text;5 using System.IO;6 using System.Data;7 using System.Windows.Forms;8 using erModel;9 using erModel;10 using erModel;1112 namespace TEMS.Service13 {14 public static class ExcelHelperForCs15 {16 #region 私有⽅法1718 /// <summary>19 /// 获取要保存的⽂件名称(含完整路径)20 /// </summary>21 /// <returns></returns>22 private static string GetSaveFilePath()23 {24 SaveFileDialog saveFileDig = new SaveFileDialog();25 saveFileDig.Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";26 saveFileDig.FilterIndex = 0;28 saveFileDig.OverwritePrompt = true;29 saveFileDig.InitialDirectory = Common.DesktopDirectory;30 string filePath = null;31 if (saveFileDig.ShowDialog() == DialogResult.OK)32 {33 filePath = saveFileDig.FileName;34 }3536 return filePath;37 }3839 /// <summary>40 /// 获取要打开要导⼊的⽂件名称(含完整路径)41 /// </summary>42 /// <returns></returns>43 private static string GetOpenFilePath()44 {45 OpenFileDialog openFileDig = new OpenFileDialog();46 openFileDig.Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";47 openFileDig.FilterIndex = 0;48 openFileDig.Title = "打开";49 openFileDig.CheckFileExists = true;50 openFileDig.CheckPathExists = true;51 openFileDig.InitialDirectory = Common.DesktopDirectory;52 string filePath = null;53 if (openFileDig.ShowDialog() == DialogResult.OK)54 {55 filePath = openFileDig.FileName;56 }5758 return filePath;59 }6061 /// <summary>62 /// 判断是否为兼容模式63 /// </summary>64 /// <param name="filePath"></param>65 /// <returns></returns>66 private static bool GetIsCompatible(string filePath)67 {68 return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase);69 }7071 /// <summary>72 /// 创建⼯作薄73 /// </summary>74 /// <param name="isCompatible"></param>75 /// <returns></returns>76 private static IWorkbook CreateWorkbook(bool isCompatible)77 {78 if (isCompatible)79 {80 return new HSSFWorkbook();81 }82 else83 {84 return new XSSFWorkbook();85 }86 }8788 /// <summary>89 /// 创建⼯作薄(依据⽂件流)90 /// </summary>91 /// <param name="isCompatible"></param>92 /// <param name="stream"></param>93 /// <returns></returns>94 private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream)95 {96 if (isCompatible)97 {98 return new HSSFWorkbook(stream);99 }100 else101 {102 return new XSSFWorkbook(stream);103 }104 }105106 /// <summary>107 /// 创建表格头单元格108 /// </summary>109 /// <param name="sheet"></param>110 /// <returns></returns>111 private static ICellStyle GetCellStyle(IWorkbook workbook)112 {113 ICellStyle style = workbook.CreateCellStyle();114 style.FillPattern = FillPattern.SolidForeground;115 style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;116117 return style;118 }120 /// <summary>121 /// 从⼯作表中⽣成DataTable122 /// </summary>123 /// <param name="sheet"></param>124 /// <param name="headerRowIndex"></param>125 /// <returns></returns>126 private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex) 127 {128 DataTable table = new DataTable();129130 IRow headerRow = sheet.GetRow(headerRowIndex);131 int cellCount = stCellNum;132133 for (int i = headerRow.FirstCellNum; i < cellCount; i++)134 {135 if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "") 136 {137 // 如果遇到第⼀个空列,则不再继续向后读取138 cellCount = i;139 break;140 }141 DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); 142 table.Columns.Add(column);143 }144145 for (int i = (headerRowIndex + 1); i <= stRowNum; i++)146 {147 IRow row = sheet.GetRow(i);148 //如果遇到某⾏的第⼀个单元格的值为空,则不再继续向下读取149 if (row != null && !string.IsNullOrEmpty(row.GetCell(0).ToString()))150 {151 DataRow dataRow = table.NewRow();152153 for (int j = row.FirstCellNum; j < cellCount; j++)154 {155 dataRow[j] = row.GetCell(j).ToString();156 }157158 table.Rows.Add(dataRow);159 }160 }161162 return table;163 }164165 #endregion166167 #region 公共导出⽅法168169 /// <summary>170 /// 由DataSet导出Excel171 /// </summary>172 /// <param name="sourceTable">要导出数据的DataTable</param>173 /// <returns>Excel⼯作表</returns>174 public static string ExportToExcel(DataSet sourceDs, string filePath = null)175 {176177 if (string.IsNullOrEmpty(filePath))178 {179 filePath = GetSaveFilePath();180 }181182 if (string.IsNullOrEmpty(filePath)) return null;183184 bool isCompatible = GetIsCompatible(filePath);185186 IWorkbook workbook = CreateWorkbook(isCompatible);187 ICellStyle cellStyle = GetCellStyle(workbook);188189 for (int i = 0; i < sourceDs.Tables.Count; i++)190 {191 DataTable table = sourceDs.Tables[i];192 string sheetName = "result" + i.ToString();193 ISheet sheet = workbook.CreateSheet(sheetName);194 IRow headerRow = sheet.CreateRow(0);195 // handling header.196 foreach (DataColumn column in table.Columns)197 {198 ICell cell = headerRow.CreateCell(column.Ordinal);199 cell.SetCellValue(column.ColumnName);200 cell.CellStyle = cellStyle;201 }202203 // handling value.204 int rowIndex = 1;205206 foreach (DataRow row in table.Rows)207 {208 IRow dataRow = sheet.CreateRow(rowIndex);209210 foreach (DataColumn column in table.Columns)212 dataRow.CreateCell(column.Ordinal).SetCellValue((row[column] ?? "").ToString());213 }214215 rowIndex++;216 }217 }218219 FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);220 workbook.Write(fs);221 fs.Dispose();222 workbook = null;223224 return filePath;225226 }227228 /// <summary>229 /// 由DataTable导出Excel230 /// </summary>231 /// <param name="sourceTable">要导出数据的DataTable</param>232 /// <returns>Excel⼯作表</returns>233 public static string ExportToExcel(DataTable sourceTable, string sheetName = "result", string filePath = null)234 {235 if (sourceTable.Rows.Count <= 0) return null;236237 if (string.IsNullOrEmpty(filePath))238 {239 filePath = GetSaveFilePath();240 }241242 if (string.IsNullOrEmpty(filePath)) return null;243244 bool isCompatible = GetIsCompatible(filePath);245246 IWorkbook workbook = CreateWorkbook(isCompatible);247 ICellStyle cellStyle = GetCellStyle(workbook);248249 ISheet sheet = workbook.CreateSheet(sheetName);250 IRow headerRow = sheet.CreateRow(0);251 // handling header.252 foreach (DataColumn column in sourceTable.Columns)253 {254 ICell headerCell = headerRow.CreateCell(column.Ordinal);255 headerCell.SetCellValue(column.ColumnName);256 headerCell.CellStyle = cellStyle;257 }258259 // handling value.260 int rowIndex = 1;261262 foreach (DataRow row in sourceTable.Rows)263 {264 IRow dataRow = sheet.CreateRow(rowIndex);265266 foreach (DataColumn column in sourceTable.Columns)267 {268 dataRow.CreateCell(column.Ordinal).SetCellValue((row[column]??"").ToString());269 }270271 rowIndex++;272 }273 FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);274 workbook.Write(fs);275 fs.Dispose();276277 sheet = null;278 headerRow = null;279 workbook = null;280281 return filePath;282 }283284 /// <summary>285 /// 由List导出Excel286 /// </summary>287 /// <typeparam name="T">类型</typeparam>288 /// <param name="data">在导出的List</param>289 /// <param name="sheetName">sheet名称</param>290 /// <returns></returns>291 public static string ExportToExcel<T>(List<T> data, IList<KeyValuePair<string, string>> headerNameList, string sheetName = "result", string filePath = null) where T : class 292 {293 if (data.Count <= 0) return null;294295 if (string.IsNullOrEmpty(filePath))296 {297 filePath = GetSaveFilePath();298 }299300 if (string.IsNullOrEmpty(filePath)) return null;301302 bool isCompatible = GetIsCompatible(filePath);304 IWorkbook workbook = CreateWorkbook(isCompatible);305 ICellStyle cellStyle = GetCellStyle(workbook);306 ISheet sheet = workbook.CreateSheet(sheetName);307 IRow headerRow = sheet.CreateRow(0);308309 for (int i = 0; i < headerNameList.Count; i++)310 {311 ICell cell = headerRow.CreateCell(i);312 cell.SetCellValue(headerNameList[i].Value);313 cell.CellStyle = cellStyle;314 }315316 Type t = typeof(T);317 int rowIndex = 1;318 foreach (T item in data)319 {320 IRow dataRow = sheet.CreateRow(rowIndex);321 for (int n = 0; n < headerNameList.Count; n++)322 {323 object pValue = t.GetProperty(headerNameList[n].Key).GetValue(item, null);324 dataRow.CreateCell(n).SetCellValue((pValue ?? "").ToString());325 }326 rowIndex++;327 }328 FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);329 workbook.Write(fs);330 fs.Dispose();331332 sheet = null;333 headerRow = null;334 workbook = null;335336 return filePath;337 }338339 /// <summary>340 /// 由DataGridView导出341 /// </summary>342 /// <param name="grid"></param>343 /// <param name="sheetName"></param>344 /// <param name="filePath"></param>345 /// <returns></returns>346 public static string ExportToExcel(DataGridView grid, string sheetName = "result", string filePath = null) 347 {348 if (grid.Rows.Count <= 0) return null;349350 if (string.IsNullOrEmpty(filePath))351 {352 filePath = GetSaveFilePath();353 }354355 if (string.IsNullOrEmpty(filePath)) return null;356357 bool isCompatible = GetIsCompatible(filePath);358359 IWorkbook workbook = CreateWorkbook(isCompatible);360 ICellStyle cellStyle = GetCellStyle(workbook);361 ISheet sheet = workbook.CreateSheet(sheetName);362363 IRow headerRow = sheet.CreateRow(0);364365 for (int i = 0; i < grid.Columns.Count; i++)366 {367 ICell cell = headerRow.CreateCell(i);368 cell.SetCellValue(grid.Columns[i].HeaderText);369 cell.CellStyle = cellStyle;370 }371372 int rowIndex = 1;373 foreach (DataGridViewRow row in grid.Rows)374 {375 IRow dataRow = sheet.CreateRow(rowIndex);376 for (int n = 0; n < grid.Columns.Count; n++)377 {378 dataRow.CreateCell(n).SetCellValue((row.Cells[n].Value ?? "").ToString());379 }380 rowIndex++;381 }382383 FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);384 workbook.Write(fs);385 fs.Dispose();386387 sheet = null;388 headerRow = null;389 workbook = null;390391 return filePath;392 }393394 #endregion396 #region 公共导⼊⽅法397398 /// <summary>399 /// 由Excel导⼊DataTable400 /// </summary>401 /// <param name="excelFileStream">Excel⽂件流</param>402 /// <param name="sheetName">Excel⼯作表名称</param>403 /// <param name="headerRowIndex">Excel表头⾏索引</param>404 /// <param name="isCompatible">是否为兼容模式</param>405 /// <returns>DataTable</returns>406 public static DataTable ImportFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible) 407 {408 IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);409 ISheet sheet = null;410 int sheetIndex = -1;411 if (int.TryParse(sheetName, out sheetIndex))412 {413 sheet = workbook.GetSheetAt(sheetIndex);414 }415 else416 {417 sheet = workbook.GetSheet(sheetName);418 }419420 DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);421422 excelFileStream.Close();423 workbook = null;424 sheet = null;425 return table;426 }427428 /// <summary>429 /// 由Excel导⼊DataTable430 /// </summary>431 /// <param name="excelFilePath">Excel⽂件路径,为物理路径。
ASP.NET编程中对Excel文档操作的探讨及应用

题。
关键 词 : As .e ; x e; 据 库 pn t E c l 数
Dic so nd Ap i a i n fEx e c s us i n a plc to o c l Do um e si nt n ASP. NET o r m mi g Pr g a n
21 年 第1 0 0 9卷 第 3 期
计 算 机 系 统 应 用
A N 编程中对 E c S .盯 P x e 文档操作的探讨及应用① l
张文博 余 文芳 ( 武汉通信指挥 学院 6系 2 2队 湖北 武 汉 4 0 1 ) 3 0 0
摘 要 : 通过对 A p n t s .e 编程中 常用的操作 E c l x e 文档 方法的探讨 ,得 出了两种 实际可行 的方法 ,并在具体项
i p ri g m o n Ex e d c m e t t te aa a e s eie , wh c s l e a r ci a p o lm i a pn t t c l o u n s O h d tb s i r lz d ih o v s p a t l r b e c n s .e p o r m m i g r ga n.
2 A pn t s .e下操作E c l x e文档的两种常用方法
通过在实践 中的归纳总结 ,笔者发现在 As .e pn t
下对 E c l x e 文档 的操作有 以下两种常用的方法 :
21 将 E c I . x e 文档作为数据源进行操作
在 .e n t环境 下 ,可 以直 接 以数 据源 的形式 操作
ASP操作Excel技术总结

目录一、环境配置二、ASP对Excel的基本操作三、ASP操作Excel生成数据表四、ASP操作Excel生成Chart图五、服务器端Excel文件浏览、下载、删除方案六、附录正文一、环境配置服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即:1.Win9x+PWS+Office2.Win2000 Professional+PWS+Office3.Win2000 Server+IIS+Office目前笔者测试成功的环境是后二者。
Office的版本没有特殊要求,考虑到客户机配置的不确定性和下兼容特性,建议服务器端Office版本不要太高,以防止客户机下载后无法正确显示。
服务器端环境配置还有两个偶然的发现是:1.笔者开发机器上原来装有金山的WPS2002,结果Excel对象创建始终出现问题,卸载WPS2002后,错误消失。
2.笔者开发ASP代码喜欢用FrontPage,结果发现如果FrontPage打开(服务器端),对象创建出现不稳定现象,时而成功时而不成功。
扩展考察后发现,Office系列的软件如果在服务器端运行,则Excel对象的创建很难成功。
服务器端还必须要设置的一点是COM组件的操作权限。
在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择Microsoft Excel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限。
保存完毕后重新启动服务器。
客户端的环境配置没发现什么特别讲究的地方,只要装有Office和IE即可,版本通用的好象都可以。
二、ASP对Excel的基本操作1、建立Excel对象set objExcelApp = CreateObject( "Excel.Application ")objExcelApp.DisplayAlerts = false不显示警告objExcelApp.Application.Visible = false不显示界面2、新建Excel文件objExcelApp.WorkBooks.addset objExcelBook = objExcelApp.ActiveWorkBookset objExcelSheets = objExcelBook.Worksheetsset objExcelSheet = objExcelBook.Sheets(1)3、读取已有Excel文件strAddr = Server.MapPath( ". ")objExcelApp.WorkBooks.Open(strAddr & "\Templet\Table.xls ")set objExcelBook = objExcelApp.ActiveWorkBookset objExcelSheets = objExcelBook.Worksheetsset objExcelSheet = objExcelBook.Sheets(1)4、另存Excel文件objExcelBook.SaveAs strAddr & "\Temp\Table.xls "5、保存Excel文件objExcelBook.Save(笔者测试时保存成功,页面报错。
Excel中常见问题的解决方式和技巧总结及实例分析

Excel中常见问题的解决方式和技巧总结及实例分析Excel是一种广泛使用的电子表格软件。
它可以帮助我们进行数据分析、表格制作、图表绘制和演示等操作。
虽然Excel是一种强大的软件工具,但是在实际使用中,我们可能会遇到一些常见的问题和困难。
本文将总结一些Excel中常见的问题和解决方式,希望能帮助读者更好地使用Excel。
一、Excel中常见问题及解决方式1.公式错误问题Excel中公式错误是常见的问题。
我们可能会遇到各种各样的公式错误,如#DIV/0!(除数为零)、#VALUE!(无效数值)、#NAME?(无法识别名称)和#REF!(无效的单元格引用)等问题。
解决方法:1)检查公式中是否存在语法错误,如括号或引号未闭合或有错别字等。
2)检查公式中是否存在单元格引用错误,如单元格引用范围是否正确等。
3)检查公式中是否存在除数为零的情况,并进行修正。
4)通过查找或替换功能修正公式中的无效数值或名称。
2.数据透视表问题数据透视表是Excel中强大的数据分析功能之一。
但是,在实际使用中,我们可能会遇到一些问题,如数据透视表的数据不准确或不完整等问题。
解决方法:1)检查数据源是否完整,是否包含所有需要分析的数据。
2)检查数据源中是否存在重复数据或数据格式错误等问题,如文本格式数据被认为是数值格式数据等。
3)检查数据透视表中是否正确设置了行或列标签以及值字段。
4)使用数据透视表筛选器进行数据的筛选、排序和分组。
3.数据有效性问题Excel中的数据有效性功能可以在输入数据时控制数据的类型、范围和格式等,避免输入错误数据。
但是,在实际使用中,我们可能会遇到一些数据有效性问题。
解决方法:1)检查数据有效性设置是否正确,包括数据类型、范围、格式等。
2)检查输入数据是否符合数据有效性设置要求。
3)在数据有效性中设置错误提醒或提示信息,以帮助用户更好地输入正确数据。
4.图表问题图表是Excel中展示数据的重要方式之一。
asp.net使用npoi读取excel模板并导出下载详解

使⽤npoi读取excel模板并导出下载详解⼀、解决传统操作Excel遇到的问题:如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。
Excel会把只包含数字的列进⾏类型转换,本来是⽂本型的,Excel会将其转成数值型的,⽐如编号000123会变成123。
导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进⾏,会报错。
Excel会根据Excel⽂件前8⾏分析数据类型,如果正好你前8⾏某⼀列只是数字,那它会认为该列为数值型,⾃动将该列转变成类似1.42702E+17格式,⽇期列变成包含⽇期和数字的。
⼆、个⼈认为使⽤NPOI的优势导出的速度很快,跟传统的⽅式不是⼀个数量级的。
不⽤担⼼进程问题,因为传统的导出⽅式每导出⼀个Excel会打开⼀个Excel进程,不会⾃动关闭,若⼿⼯关闭,必须遍历把所有的Excel进程都杀死,这样会造成不能并发导出的问题。
第⼀步:在解决⽅案中添加引⽤。
在这⾥使⽤的是NPOI 1.2.5的.net2.0版本,需要引⽤两个⽂件:第⼆步:在CS⽂件中添加引⽤。
复制代码代码如下:using erModel;using System.IO;//内存流的使⽤using erModel第三步:具体使⽤代码复制代码代码如下:#region加载模板⽂件到⼯作簿对象中//创建⼯作簿对象HSSFWorkbookhssfworkbook;//打开模板⽂件到⽂件流中using(FileStreamfile=newFileStream(HttpContext.Current.Request.PhysicalApplicationPath+@"template/book1.xls",FileMode.Open,FileAccess.Read)) {//将⽂件流中模板加载到⼯作簿对象中hssfworkbook=newHSSFWorkbook(file);}#endregion#region根据模板设置⼯作表的内容//建⽴⼀个名为Sheet1的⼯作表ISheetsheet1=hssfworkbook.GetSheet("Sheet1");//将数据添加到表中对应的单元格中,因为⾏已经创建,不需要重新创建⾏sheet1.GetRow(1).GetCell(1).SetCellValue(200200);sheet1.GetRow(2).GetCell(1).SetCellValue(300);sheet1.GetRow(3).GetCell(1).SetCellValue(500050);sheet1.GetRow(4).GetCell(1).SetCellValue(8000);sheet1.GetRow(5).GetCell(1).SetCellValue(110);sheet1.GetRow(6).GetCell(1).SetCellValue(100);sheet1.GetRow(7).GetCell(1).SetCellValue(200);sheet1.GetRow(8).GetCell(1).SetCellValue(210);sheet1.GetRow(9).GetCell(1).SetCellValue(2300);sheet1.GetRow(10).GetCell(1).SetCellValue(240);sheet1.GetRow(11).GetCell(1).SetCellValue(180123);sheet1.GetRow(12).GetCell(1).SetCellValue(150);//强制Excel重新计算表中所有的公式sheet1.ForceFormulaRecalculation=true;#endregion#region设置响应头(⽂件名和⽂件格式)//设置响应的类型为ExcelResponse.ContentType="application/vnd.ms-excel";//设置下载的Excel⽂件名Response.AddHeader("Content-Disposition",string.Format("attachment;filename={0}","test.xls"));//Clear⽅法删除所有缓存中的HTML输出。
ASP.NET编程中对Excel文档操作的探讨及应用

编程中对Excel文档操作的探讨及应用
张文博;余文芳
【期刊名称】《计算机系统应用》
【年(卷),期】2010(019)003
【摘要】通过对编程中常用的操作Excel文档方法的探讨,得出了两种实际可行的方法,并在具体项目中得到了应用,实现了Excel文档导入导出数据库的功能,解决了数据库系统开发中的一个实际问题.
【总页数】3页(P187-189)
【作者】张文博;余文芳
【作者单位】武汉通信指挥学院6系22队,湖北武汉430010;武汉通信指挥学院6系22队,湖北武汉430010
【正文语种】中文
【相关文献】
1.基于工作过程的项目化教学法在程序设计基础与应用课程中的应用 [J], 蒋雪君
2.《程序设计》课程中页面间传值方法探讨 [J], 李莉;森干
3.《程序设计》课程中页面间传值方法的探讨 [J], 李莉;森干
4.利用操作Excel文档 [J], 刘万军
5.基于实现WebGIS数据操作的探讨 [J], 于勇;张子平
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(这是写好的视图,基于视图来检索的),这个排序的字段顺序就不能变了,变了的话就不太好生成想要的形式了,如下图:这个也是动态画的,用了个简单的模板,模板就一个表头,没多大意义,除非表头很复杂而且在列表中不需要重画,考虑模板就比较好,向上面那个一月份国际的和其它月份的都是需要重画表头的。