- 浏览: 110947 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
wangming_1993:
[/img][/img][/img][/img][/img][ ...
nodejs express 上传文件 临时路径 -
beyond_开阔天空:
像scheme_menu中的scheme_second_men ...
内嵌数组操作 -
beyond_开阔天空:
请问一下,像这个子文档中的数组怎么插入、更新、删除{ &q ...
内嵌数组操作 -
yz285131311:
使用本地数据添加进 jqgrid, 那当它点击下一页这些时候能 ...
jqgrid 的一些操作 动态增加列 用本地 数据 修改表格 -
houyinke:
[/url][url][/url][url][/url][ur ...
java缩放图片
原理很简单:
1 copy模版文件到临时文件夹,并改名。(我用的是时间)
2 修改这个临时文件。(这部分还没有想好怎么作, 毕竟是C#菜鸟啊)
3 下载这个临时文件。
4 删除临时文件。
在系统中不会留下任何进程, 哈哈。
微软的东西, 你用到了就一定要关闭。
代码中 close()方法关闭掉了大部分。
但还有一些
private Excel.Range oRng;
对象没有关掉的话 系统中会留下 EXcel.exe 进程, 很危险啊!!!!
要引入
Microsoft.Office.Interop.Excel.dll 我的版本是 12.0.0.0
using System; using System.Data; using System.Configuration; using System.Diagnostics; using Excel = Microsoft.Office.Interop.Excel; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Web; /// <summary> /// 根据模版写Excel文件,并提供下载 /// </summary> public class ExcelComManager { private Excel.ApplicationClass ExcelObj = null; //Excel对象 private Excel._Workbook xBk; //工作薄 private Excel._Worksheet xSt; //工作Sheet private Excel.Range xRng; //操作单元格样式 private object missing = System.Reflection.Missing.Value; /// <summary> /// 模板文件名 完全路径 /// </summary> private string templateFilePath; /// <summary> /// 模版描述文件 完全路径 /// </summary> private string templateDiscriptionFilePath; public ExcelComManager() { } /// <summary> /// 根据Excel模版,创建Excel临时文件并传输 /// </summary> /// <param name="templatName">模版名</param> public void createExcelAndSend(string templatName, Object dataObject) { templateFilePath = getTemplatePath(templatName, ".xls"); //模板文件 templateDiscriptionFilePath = getTemplatePath(templatName, ".xml"); //模板描述文件 string tempFilePath = getTempFileName(); //临时文件全名 copyFile(templateFilePath, tempFilePath); //拷贝模版文件到临时文件夹 connectTempExcel(tempFilePath); //打开临时Excel文件 //这里应该根据不同的模版调用不同的写入方法 //还没有完成 writeExcelContent(dataObject); //操作临时Excel文件 sendExcelFile(tempFilePath, "cc.xls"); //发送文件到客户端 deleteTempFile(tempFilePath); //删除临时文件 } #region copy模版文件到指定目录 并改名 /// <summary> /// copy模版文件到指定目录 并改名 /// </summary> /// <param name="scrFile">要拷贝的原文件全路径名</param> /// <param name="destFile">要生成的目标文件的全路径名</param> /// <returns></returns> private void copyFile(string scrFile, string destFile) { try { System.IO.File.Copy(scrFile, destFile); } catch(Exception e) { throw new Exception("拷贝文件出错"); } } #endregion #region 删除临时Excel文件 /// <summary> /// 删除临时Excel文件 /// </summary> /// <param name="tempFile">临时文件全路径名</param> private void deleteTempFile(string tempFile) { try { System.IO.FileInfo file = new System.IO.FileInfo(tempFile); if(file.Exists){ file.Delete(); } } catch (Exception e) { throw new Exception("删除文件出错"); } } #endregion #region 打开临时Excel文件 /// <summary> /// 打开临时Excel文件,(copy过来的并改好名字的模版) /// </summary> /// <param name="filePath">Excel文件全路径名</param> public void connectTempExcel(string filePath) { try { ExcelObj = new Excel.ApplicationClass(); xBk = ExcelObj.Workbooks.Open(filePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); xSt = (Excel._Worksheet)xBk.ActiveSheet; } catch (Exception e) { close(); throw new Exception("打开Excel文件出错"); } } #endregion #region 连接Excel public void connectExcel() { try { object missing = System.Reflection.Missing.Value; //如果模版名为空 或 模版文件没有找到 则新建一个 if (string.IsNullOrEmpty(templateFilePath)) { xBk = ExcelObj.Workbooks.Add(true); } else { xBk = ExcelObj.Workbooks.Open(templateFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); if(xBk == null){ throw new Exception("打开模版文件出错"); } } xBk.SaveAs(getTempFileName(), Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); xSt = (Excel._Worksheet)xBk.ActiveSheet; } catch (Exception e) { close(); throw; } } #endregion #region 根据数据结果集, 修改临时文件内容 /// <summary> /// 根据数据结果集,修改临时文件内容 /// </summary> /// <param name="ds">要传入到Excel的数据集</param> /// <returns></returns> private void writeExcelContent(Object o) { try { ExcelObj.Visible = false; ExcelDescriptions a = new ExcelDescriptions(); Hashtable templateXml = a.parseXml(templateDiscriptionFilePath); WookSheetWrite wStW = new WookSheetWrite(xSt); wStW.setWorksheet(o, templateXml); //xSt.Cells[2, 2] = "aa"; //xSt.Cells[25, 2] = "aa"; //xRng = xSt.get_Range("B2", missing); //xRng.Value2 = "aa"; //xRng = xSt.get_Range(xSt.Cells[2, 2], xSt.Cells[2, 2]); //xRng.HorizontalAlignment = -4108; //xRng.Borders.LineStyle = 1; //如果用到 xRng = xSt.get_Range(xSt.Cells[2, 2], xSt.Cells[2, 2]); 就必须关掉 //否则系统里就会有一个没关掉的 Excel.exe进程 //System.Runtime.InteropServices.Marshal.ReleaseComObject(xRng); //xSt.Cells[2, 5] = "bb"; //xRng = xSt.get_Range(xSt.Cells[2, 5], xSt.Cells[2, 5]); //xRng.HorizontalAlignment = -4108; //xRng.Borders.LineStyle = 1; //System.Runtime.InteropServices.Marshal.ReleaseComObject(xRng); xBk.Save(); } catch (Exception e) { close(); throw new Exception(e.Message + "操作临时Excel文件时出错"); } finally { close(); } } #endregion #region 根据传入的模版名设置绝对路径中的模板名 /// <summary> /// 根据传入的模版名设置绝对路径中的模板名 /// </summary> /// <param name="strTemplateName">模板名</param> /// <returns></returns> private string getTemplatePath(string templateName, string postfix) { if (string.IsNullOrEmpty(templateName)) { throw new Exception("模版文件名为空"); } //从配置文件中读取,Excel模版文件存放位置 string templateFolderPath = System.Configuration.ConfigurationSettings.AppSettings["ExcelTemplatePath"]; if (string.IsNullOrEmpty(templateFolderPath)) { throw new Exception("没有找到模版文件夹路径"); } return templateFolderPath + templateName + postfix; } #endregion #region 生成临时文件的文件名 /// <summary> /// 设置保存到临时文件中的文件名。 /// 带路径的。 /// 这是一个线程安全的方法。 /// </summary> /// <returns>临时文件名</returns> [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)] private string getTempFileName() { string tempFilePath = System.Configuration.ConfigurationSettings.AppSettings["ExcelTempFilePath"]; String strFile = System.DateTime.Now.ToFileTimeUtc().ToString() + ".xls";//创建一个临时文件名 if (string.IsNullOrEmpty(tempFilePath)) { throw new Exception("没有找到临时文件路径"); } return tempFilePath + strFile; } #endregion #region 下载文件 /// <summary> /// /// 在网络上 传一个文件 /// /// </summary> /// <param name="srcFileName">要传输的文件的名字</param> /// /// <param name="newFileName">新的文件的名字</param> public void sendExcelFile(string srcFileName, string newFileName) { if (!string.IsNullOrEmpty(srcFileName)) { //这里应该判断srcFileName 是否是全路径名 //System.IO.FileInfo file = new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + srcFileName); System.IO.FileInfo file = new System.IO.FileInfo(srcFileName); if (file.Exists) { string FileName = newFileName; string ExtendName = file.Name; if (ExtendName.Length > 4) { int i = ExtendName.LastIndexOf("."); ExtendName = ExtendName.Substring(i); FileName += ExtendName; } //Response.AppendHeader(@"Content-Disposition", @"attachment;filename=" + HttpUtility.UrlEncode("报表.xls",System.Text.Encoding.UTF8)); //这句话中的 attachment 改成 inline 就可以了 HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8)); HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString()); HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.Filter.Close(); HttpContext.Current.Response.WriteFile(file.FullName); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.Close(); //HttpContext.Current.Response.End(); } else { HttpContext.Current.Response.Write("对不起,文件" + AppDomain.CurrentDomain.BaseDirectory + srcFileName + "不存在"); } } } #endregion #region 关闭使用到的Excel进程 /// <summary> /// 关闭使用到的Excel进程 /// </summary> private void close() { //if的顺序不能变 if (ExcelObj != null) { if (xBk != null) { xBk.Close(null, null, null); } ExcelObj.Workbooks.Close(); ExcelObj.Quit(); } if (xRng != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xRng); xRng = null; } if (xSt != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); xSt = null; } if (xBk != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk); xBk = null; } if (ExcelObj != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj); ExcelObj = null; } GC.Collect(); } #endregion }
配置文件
<appSettings > <add key="ExcelTempaltePath" value="F:/koide_sufen/ExcelTemplate/"/> <add key="ExcelTempFilePath" value="F:/koide_sufen/ExcelTempFile/"/> </appSettings>
调用
protected void Button1_Click(object sender, EventArgs e) { ExcelComManager a = new ExcelComManager(); a.createExcelAndSend("LOTO_SAMPLE.xls"); }
vs2008下测试通过
发表评论
-
C# 根据模版写Excel(Com)二
2008-11-18 12:57 2656《C# 根据模版写Excel(Com)一 》 里给出写Ex ... -
c# 通过反射 实例化类
2008-11-17 16:09 38841. 用Type 在 website 下 string ... -
GridView 嵌套 ObjectDataSource数据源绑定
2008-11-11 15:53 2809这个方法是目前我知道的最好的绑定嵌套的GridView方法了。 ... -
ajax gridview 嵌套
2008-11-10 17:15 2757ajax GridView 嵌套 弹出模态窗口 页面结 ... -
C# 线程同步
2008-10-31 10:57 1149原文地址 http://www.cnblogs.com/m ... -
让ajax 控件先执行服务端事件
2008-10-28 15:51 1371这里用的是 一个 ModalPopupExtender 控件 ... -
net 常用正则
2008-10-23 13:35 844从别人那里 copy过来的 http://www.cnbl ... -
gridview排序
2008-10-14 13:58 4448在GridView中可以通过两种方式来指定模板列的标题: ... -
gridview 学习
2008-10-08 15:04 1039一个对象A里 包含另一个对象B时 要在gridview里帮定 ...
相关推荐
在这个特定的场景中,我们讨论的是如何利用C#中的dataGridView控件来实现一个功能,这个功能允许用户按照自定义的Excel模板导出数据。这涉及到对dataGridView控件的操作,以及将数据转换为Excel格式的技术。 首先,...
本主题聚焦于如何使用C#来实现一个复杂的Excel导出功能,结合模板和映射文件,以及可能涉及的操作Excel宏。这个过程通常是为了满足业务需求,如自定义报告生成、数据分析和数据可视化。 首先,我们要理解什么是模板...
本主题聚焦于如何利用C#将数据导出到Excel模板,并自定义字段,这是一个常见的需求,尤其是在数据分析、报告生成和数据共享的场景中。 在C#中,我们可以利用各种库来操作Excel,如EPPlus、NPOI或Microsoft.Office....
在C#编程中,生成Excel文件常常用于数据报表或数据分析的导出,模版写Excel是一种常见的方法,它允许开发者预先定义好Excel的格式和布局,然后根据数据填充内容。以下将详细介绍标题和描述中涉及的知识点: 1. **...
在本示例中,我们将深入探讨如何使用Aspose库在.NET环境中根据模板导出Excel电子表格。这个过程涉及到多个步骤和技术,包括理解Aspose的API、模板设计以及数据注入。 首先,Aspose库提供了强大的Excel操作功能,...
在C#编程中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成和自动化办公等场景。本文将深入探讨如何使用C#来填充Excel模板数据并进行打印操作。 首先,`PrintStudent.cs`可能包含一个名为`Print...
综上所述,"c# 按模板导出Excel 通用类"是一个实用的工具,它简化了数据导出流程,提高了开发效率,使得C#程序员在处理Excel相关任务时更加便捷。通过掌握和利用这类通用类,开发者可以更好地服务于数据报告、分析及...
本话题聚焦于如何利用C#在已有的Excel模板文件中插入数据行,同时保持模板原有的格式不受破坏。这在数据分析、报表生成或批量处理数据时非常常见。 首先,我们需要了解的是Microsoft Office Interop库,这是.NET ...
本主题主要围绕C#如何使用不同的方法来处理Excel,尤其是将DataTable数据写入Excel文件,并涉及Excel模板处理和样式管理。 首先,我们来探讨使用Microsoft Office Interop库的方式。这是微软提供的一个接口,可以...
总的来说,C#创建Excel模板是一个灵活且功能强大的过程,它允许开发人员根据需求构建定制化的数据处理和报告工具。结合适当的库,如EPPlus,你可以避免直接依赖Office,使你的应用具有更好的兼容性和可部署性。通过...
在这个场景下,我们将深入探讨如何使用C#和Itextsharp库根据模板导出PDF报表。 首先,我们需要理解模板的概念。模板通常是一个预定义的PDF文件,包含固定的布局和样式,而实际的数据将被插入到这些预定的位置。在...
2. 加载模板Excel文件: ```csharp FileInfo templateFileInfo = new FileInfo("模板路径.xlsx"); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 如果不用于商业用途,可以不设置此行 Excel...
c#源码工具类型,主要用于EXCEL模板编辑,批量导入图片到EXCEL固定单元格,批量导入文字到EXCEL固定单元格,实现拖放图片显示,循环遍历子控件添加事件等资源,程序附加模板。可直接使用。扩展性强,下载后希望给个...
在C# WinForm开发中,实现Excel打印工具是一项常见的需求,尤其在企业级应用中,报表和数据分析的呈现经常依赖于Excel格式。本知识点将详细讲解如何利用C#和WinForm来创建一个基于Excel的打印工具,以及相关的关键...
本文将深入探讨如何使用NPOI将数据导入到模板Excel中,特别关注对.xlsx格式的支持。 首先,NPOI是一个开源的.NET库,它实现了Apache POI API的功能,使得.NET开发者能够与Microsoft Office文档进行交互。NPOI提供了...
C#使用NPOI给EXCEL模板填充数据,公司需要数据输入到execl表,写了一个程序,可以二次开发
C#读取Excel单元格内容并赋值给text一个简单demo C#读取Excel单元格内容并赋值给text一个简单demo C#读取Excel单元格内容并赋值给text一个简单demo
"NPOI基于模板导出到excel"是指利用NPOI库的功能,根据预先设计的模板来生成新的Excel文件,这在数据报表生成、批量数据处理和自动化办公场景中非常实用。 首先,让我们详细了解一下NPOI的主要功能和工作原理。NPOI...
本话题聚焦于如何利用C#操作Excel文件,尤其是套用模板并对数据进行分页。这通常涉及到读写Excel文件,使用模板,以及处理大量数据的高效方法。 首先,C#中操作Excel文件主要依赖于第三方库,例如NPOI、EPPlus等。...
公司因业务需求,需要开发一个自动向供应商发送邮件的系统。难点是 邮件需附带一个Excel附件,此...根据供应商的不同而不同,相关部门已提供一个Excel内容模板。 用VS2010写了一个例子,解决了此问题。与大家分享!