`
xufei0110
  • 浏览: 110947 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

c# 根据模版写Excel(Com) 一

    博客分类:
  • .net
阅读更多

原理很简单:

    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#(dataGridView按Excel模板导出)控件

    在这个特定的场景中,我们讨论的是如何利用C#中的dataGridView控件来实现一个功能,这个功能允许用户按照自定义的Excel模板导出数据。这涉及到对dataGridView控件的操作,以及将数据转换为Excel格式的技术。 首先,...

    C# 导出利用模板,映射文件导出复杂excel

    本主题聚焦于如何使用C#来实现一个复杂的Excel导出功能,结合模板和映射文件,以及可能涉及的操作Excel宏。这个过程通常是为了满足业务需求,如自定义报告生成、数据分析和数据可视化。 首先,我们要理解什么是模板...

    C# 将数据导出到excel模板 自定义字段

    本主题聚焦于如何利用C#将数据导出到Excel模板,并自定义字段,这是一个常见的需求,尤其是在数据分析、报告生成和数据共享的场景中。 在C#中,我们可以利用各种库来操作Excel,如EPPlus、NPOI或Microsoft.Office....

    C# 根据模版写Excel

    在C#编程中,生成Excel文件常常用于数据报表或数据分析的导出,模版写Excel是一种常见的方法,它允许开发者预先定义好Excel的格式和布局,然后根据数据填充内容。以下将详细介绍标题和描述中涉及的知识点: 1. **...

    使用aspose导出Excel(根据模板导出excel).zip

    在本示例中,我们将深入探讨如何使用Aspose库在.NET环境中根据模板导出Excel电子表格。这个过程涉及到多个步骤和技术,包括理解Aspose的API、模板设计以及数据注入。 首先,Aspose库提供了强大的Excel操作功能,...

    c# 填充Excel并打印类

    在C#编程中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成和自动化办公等场景。本文将深入探讨如何使用C#来填充Excel模板数据并进行打印操作。 首先,`PrintStudent.cs`可能包含一个名为`Print...

    c# 按模板导出Excel 通用类

    综上所述,"c# 按模板导出Excel 通用类"是一个实用的工具,它简化了数据导出流程,提高了开发效率,使得C#程序员在处理Excel相关任务时更加便捷。通过掌握和利用这类通用类,开发者可以更好地服务于数据报告、分析及...

    C#向EXCEL模板文件中插入数据行

    本话题聚焦于如何利用C#在已有的Excel模板文件中插入数据行,同时保持模板原有的格式不受破坏。这在数据分析、报表生成或批量处理数据时非常常见。 首先,我们需要了解的是Microsoft Office Interop库,这是.NET ...

    C#操作EXCEL EXCEL类库 Excel模板处理 将DataTable数据写入Excel文件 C#数据写入EXCEL

    本主题主要围绕C#如何使用不同的方法来处理Excel,尤其是将DataTable数据写入Excel文件,并涉及Excel模板处理和样式管理。 首先,我们来探讨使用Microsoft Office Interop库的方式。这是微软提供的一个接口,可以...

    C#创建EXCEl模板

    总的来说,C#创建Excel模板是一个灵活且功能强大的过程,它允许开发人员根据需求构建定制化的数据处理和报告工具。结合适当的库,如EPPlus,你可以避免直接依赖Office,使你的应用具有更好的兼容性和可部署性。通过...

    C#版本Itextsharp根据模板导出pdf报表

    在这个场景下,我们将深入探讨如何使用C#和Itextsharp库根据模板导出PDF报表。 首先,我们需要理解模板的概念。模板通常是一个预定义的PDF文件,包含固定的布局和样式,而实际的数据将被插入到这些预定的位置。在...

    C#写入固定模版的EXCEL

    2. 加载模板Excel文件: ```csharp FileInfo templateFileInfo = new FileInfo("模板路径.xlsx"); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 如果不用于商业用途,可以不设置此行 Excel...

    C# EXCEL模板操作.rar

    c#源码工具类型,主要用于EXCEL模板编辑,批量导入图片到EXCEL固定单元格,批量导入文字到EXCEL固定单元格,实现拖放图片显示,循环遍历子控件添加事件等资源,程序附加模板。可直接使用。扩展性强,下载后希望给个...

    C#winform,excel打印工具

    在C# WinForm开发中,实现Excel打印工具是一项常见的需求,尤其在企业级应用中,报表和数据分析的呈现经常依赖于Excel格式。本知识点将详细讲解如何利用C#和WinForm来创建一个基于Excel的打印工具,以及相关的关键...

    ASP.NET/C# 使用NPOI 将数据导入到模板Excel[支持xlsx][源代码]

    本文将深入探讨如何使用NPOI将数据导入到模板Excel中,特别关注对.xlsx格式的支持。 首先,NPOI是一个开源的.NET库,它实现了Apache POI API的功能,使得.NET开发者能够与Microsoft Office文档进行交互。NPOI提供了...

    C#使用NPOI给EXCEL模板填充数据.rar

    C#使用NPOI给EXCEL模板填充数据,公司需要数据输入到execl表,写了一个程序,可以二次开发

    C#读取Excel单元格内容并赋值给text一个简单demo

    C#读取Excel单元格内容并赋值给text一个简单demo C#读取Excel单元格内容并赋值给text一个简单demo C#读取Excel单元格内容并赋值给text一个简单demo

    NPOI基于模板导出到excel

    "NPOI基于模板导出到excel"是指利用NPOI库的功能,根据预先设计的模板来生成新的Excel文件,这在数据报表生成、批量数据处理和自动化办公场景中非常实用。 首先,让我们详细了解一下NPOI的主要功能和工作原理。NPOI...

    C#操作Excel,套用模板并对数据进行分页

    本话题聚焦于如何利用C#操作Excel文件,尤其是套用模板并对数据进行分页。这通常涉及到读写Excel文件,使用模板,以及处理大量数据的高效方法。 首先,C#中操作Excel文件主要依赖于第三方库,例如NPOI、EPPlus等。...

    C# DataSet创建Excel文件(多sheet,支持Excel模板)

    公司因业务需求,需要开发一个自动向供应商发送邮件的系统。难点是 邮件需附带一个Excel附件,此...根据供应商的不同而不同,相关部门已提供一个Excel内容模板。 用VS2010写了一个例子,解决了此问题。与大家分享!

Global site tag (gtag.js) - Google Analytics