`

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

    博客分类:
  • C#
阅读更多
using System;
using System.IO;
using System.Data;
using System.Reflection;
using System.Diagnostics;
using cfg = System.Configuration;
//using Excel;

namespace ExcelHelperTest
{
    //// <summary>
    /// 功能说明:套用模板输出Excel,并对数据进行分页
    /// 作    者:猪头
    /// </summary>
    public class ExcelHelper
    {
        protected string templetFile = null;
        protected string outputFile = null;
        protected object missing = Missing.Value;

        //// <summary>
        /// 构造函数,需指定模板文件和输出文件完整路径
        /// </summary>
        /// <param name="templetFilePath">Excel模板文件路径</param>
        /// <param name="outputFilePath">输出Excel文件路径</param>
        public ExcelHelper(string templetFilePath,string outputFilePath)
        {
            if(templetFilePath == null)
                throw new Exception("Excel模板文件路径不能为空!");

            if(outputFilePath == null)
                throw new Exception("输出Excel文件路径不能为空!");

            if(!File.Exists(templetFilePath))
                throw new Exception("指定路径的Excel模板文件不存在!");

            this.templetFile = templetFilePath;
            this.outputFile = outputFilePath;

        }

        //// <summary>
        /// 将DataTable数据写入Excel文件(套用模板并分页)
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="rows">每个WorkSheet写入多少行数据</param>
        /// <param name="top">行索引</param>
        /// <param name="left">列索引</param>
        /// <param name="sheetPrefixName">WorkSheet前缀名,比如:前缀名为“Sheet”,那么WorkSheet名称依次为“Sheet-1,Sheet-2”</param>
        public void DataTableToExcel(DataTable dt,int rows,int top,int left,string sheetPrefixName)
        {
            int rowCount = dt.Rows.Count;        //源DataTable行数
            int colCount = dt.Columns.Count;    //源DataTable列数
            int sheetCount = this.GetSheetCount(rowCount,rows);    //WorkSheet个数
            DateTime beforeTime;    
            DateTime afterTime;
            
            if(sheetPrefixName == null || sheetPrefixName.Trim() == "")
                sheetPrefixName = "Sheet";

            //创建一个Application对象并使其可见
            beforeTime = DateTime.Now;
            Excel.Application app = new Excel.ApplicationClass();
            app.Visible = true;
            afterTime = DateTime.Now;

            //打开模板文件,得到WorkBook对象
            Excel.Workbook workBook = app.Workbooks.Open(templetFile,missing,missing,missing,missing,missing,
                                missing,missing,missing,missing,missing,missing,missing);

            //得到WorkSheet对象
            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

            //复制sheetCount-1个WorkSheet对象
            for(int i=1;i<sheetCount;i++)
            {
                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing,workBook.Worksheets[i]);
            }

            将源DataTable数据写入Excel#region 将源DataTable数据写入Excel
            for(int i=1;i<=sheetCount;i++)
            {
                int startRow = (i - 1) * rows;        //记录起始行索引
                int endRow = i * rows;            //记录结束行索引

                //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数
                if(i == sheetCount)
                    endRow = rowCount;

                //获取要写入数据的WorkSheet对象,并重命名
                Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
                sheet.Name = sheetPrefixName + "-" + i.ToString();

                //将dt中的数据写入WorkSheet
                for(int j=0;j<endRow-startRow;j++)
                {
                    for(int k=0;k<colCount;k++)
                    {
                        sheet.Cells[top + j,left + k] = dt.Rows[startRow + j][k].ToString();
                    }
                }

                //写文本框数据
                Excel.TextBox txtAuthor = (Excel.TextBox)sheet.TextBoxes("txtAuthor");
                Excel.TextBox txtDate = (Excel.TextBox)sheet.TextBoxes("txtDate");
                Excel.TextBox txtVersion = (Excel.TextBox)sheet.TextBoxes("txtVersion");

                txtAuthor.Text = "KLY.NET的Blog";
                txtDate.Text = DateTime.Now.ToShortDateString();
                txtVersion.Text = "1.0.0.0";
            }
            #endregion

            //输出Excel文件并退出
            try
            {
                workBook.SaveAs(outputFile,missing,missing,missing,missing,missing,Excel.XlSaveAsAccessMode.xlExclusive,missing,missing,missing,missing);
                workBook.Close(null,null,null);
                app.Workbooks.Close();
                app.Application.Quit();
                app.Quit();

                System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

                workSheet=null;
                workBook=null;
                app=null;

                GC.Collect();
            }
            catch(Exception e)
            {
                throw e;
            }
            finally
            {
                Process[] myProcesses;
                DateTime startTime;
                myProcesses = Process.GetProcessesByName("Excel");

                //得不到Excel进程ID,暂时只能判断进程启动时间
                foreach(Process myProcess in myProcesses)
                {
                    startTime = myProcess.StartTime;

                    if(startTime > beforeTime && startTime < afterTime)
                    {
                        myProcess.Kill();
                    }
                }
            }
            
        }

        
        //// <summary>
        /// 获取WorkSheet数量
        /// </summary>
        /// <param name="rowCount">记录总行数</param>
        /// <param name="rows">每WorkSheet行数</param>
        private int GetSheetCount(int rowCount,int rows)
        {
            int n = rowCount % rows;        //余数

            if(n == 0)
                return rowCount / rows;
            else
                return Convert.ToInt32(rowCount / rows) + 1;
        }


        //// <summary>
        /// 将二维数组数据写入Excel文件(套用模板并分页)
        /// </summary>
        /// <param name="arr">二维数组</param>
        /// <param name="rows">每个WorkSheet写入多少行数据</param>
        /// <param name="top">行索引</param>
        /// <param name="left">列索引</param>
        /// <param name="sheetPrefixName">WorkSheet前缀名,比如:前缀名为“Sheet”,那么WorkSheet名称依次为“Sheet-1,Sheet-2”</param>
        public void ArrayToExcel(string[,] arr,int rows,int top,int left,string sheetPrefixName)
        {
            int rowCount = arr.GetLength(0);        //二维数组行数(一维长度)
            int colCount = arr.GetLength(1);    //二维数据列数(二维长度)
            int sheetCount = this.GetSheetCount(rowCount,rows);    //WorkSheet个数
            DateTime beforeTime;    
            DateTime afterTime;
            
            if(sheetPrefixName == null || sheetPrefixName.Trim() == "")
                sheetPrefixName = "Sheet";

            //创建一个Application对象并使其可见
            beforeTime = DateTime.Now;
            Excel.Application app = new Excel.ApplicationClass();
            app.Visible = true;
            afterTime = DateTime.Now;

            //打开模板文件,得到WorkBook对象
            Excel.Workbook workBook = app.Workbooks.Open(templetFile,missing,missing,missing,missing,missing,
                missing,missing,missing,missing,missing,missing,missing);

            //得到WorkSheet对象
            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

            //复制sheetCount-1个WorkSheet对象
            for(int i=1;i<sheetCount;i++)
            {
                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing,workBook.Worksheets[i]);
            }

            将二维数组数据写入Excel#region 将二维数组数据写入Excel
            for(int i=1;i<=sheetCount;i++)
            {
                int startRow = (i - 1) * rows;        //记录起始行索引
                int endRow = i * rows;            //记录结束行索引

                //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数
                if(i == sheetCount)
                    endRow = rowCount;

                //获取要写入数据的WorkSheet对象,并重命名
                Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
                sheet.Name = sheetPrefixName + "-" + i.ToString();

                //将二维数组中的数据写入WorkSheet
                for(int j=0;j<endRow-startRow;j++)
                {
                    for(int k=0;k<colCount;k++)
                    {
                        sheet.Cells[top + j,left + k] = arr[startRow + j,k];
                    }
                }

                Excel.TextBox txtAuthor = (Excel.TextBox)sheet.TextBoxes("txtAuthor");
                Excel.TextBox txtDate = (Excel.TextBox)sheet.TextBoxes("txtDate");
                Excel.TextBox txtVersion = (Excel.TextBox)sheet.TextBoxes("txtVersion");

                txtAuthor.Text = "KLY.NET的Blog";
                txtDate.Text = DateTime.Now.ToShortDateString();
                txtVersion.Text = "1.0.0.0";
            }
            #endregion

            //输出Excel文件并退出
            try
            {
                workBook.SaveAs(outputFile,missing,missing,missing,missing,missing,Excel.XlSaveAsAccessMode.xlExclusive,missing,missing,missing,missing);
                workBook.Close(null,null,null);
                app.Workbooks.Close();
                app.Application.Quit();
                app.Quit();

                System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

                workSheet=null;
                workBook=null;
                app=null;

                GC.Collect();
            }
            catch(Exception e)
            {
                throw e;
            }
            finally
            {
                Process[] myProcesses;
                DateTime startTime;
                myProcesses = Process.GetProcessesByName("Excel");

                //得不到Excel进程ID,暂时只能判断进程启动时间
                foreach(Process myProcess in myProcesses)
                {
                    startTime = myProcess.StartTime;

                    if(startTime > beforeTime && startTime < afterTime)
                    {
                        myProcess.Kill();
                    }
                }
            }
            
        }
    }
}

分享到:
评论

相关推荐

    套用模板输出Excel,并对数据进行分页

    套用模板输出Excel,并对数据进行分页 套用模板输出Excel,并对数据进行分页 套用模板输出Excel,并对数据进行分页 套用模板输出Excel,并对数据进行分页 套用模板输出Excel,并对数据进行分页

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

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

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

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

    C# 操作Excel写数据生成图表

    C#的,winform的,这是我自己写的一个c#操作excel的例子,其中包括数据操作,字体,格式,单元格等操作,还有一个生成柱状图的方法,所有的方法都在ExcelHelper.cs类里,点击Form1窗体里的按钮可以看到各种操作的...

    c# 填充Excel并打印类

    本文将深入探讨如何使用C#来填充Excel模板数据并进行打印操作。 首先,`PrintStudent.cs`可能包含一个名为`PrintStudent`的类,这个类是用来处理Excel的填充和打印功能的核心代码。在C#中,我们可以利用开源库如...

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

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

    C#大量数据导出到Excel自动分页导出

    C#大量数据导出到Excel,超过65536行时自动分页导出

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

    综上所述,利用C#、模板和映射文件导出复杂Excel涉及的知识点涵盖了文件操作、数据处理、模板引擎以及可能的VBA宏操作。在实践中,熟练掌握这些技术可以帮助开发者高效地生成符合业务需求的定制化Excel报表。

    C#对excel的操作C#对excel的操作

    C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作C#对excel的操作

    C#创建EXCEl模板

    本主题聚焦于如何利用C#来创建Excel模板,这在数据分析、报告生成和自动化工作流中非常常见。Excel提供了强大的数据管理和分析功能,而通过C#编程可以将这些功能集成到自定义应用中,实现数据的自动化处理和格式化。...

    C#(dataGridView按Excel模板导出)控件

    这涉及到对dataGridView控件的操作,以及将数据转换为Excel格式的技术。 首先,dataGridView是.NET Framework中的一种常用控件,用于显示和编辑表格数据。它提供了丰富的功能,如排序、过滤、编辑等,适用于各种...

    C#创建excel并把数组数据保存到excel指定列

    C# 创建 Excel 并保存数组数据到指定列 C# 创建 Excel 文档并将数组数据保存到指定列是很多开发者需要掌握的一项技术。本文将详细讲述如何使用 C# 创建 Excel 文档,并将数组数据保存到指定的列中。 首先,为了...

    C#写入固定模版的EXCEL

    总之,通过C#和EPPlus库,我们可以方便地读取、修改并保存Excel文件,实现数据自动化处理。在实际项目中,可以根据需求调整代码,例如从数据库获取数据,或者动态构建数据源。希望这个示例能帮助你理解如何在C#中...

    C# 操作Excel(导入,导出及对数据处理)

    本主题聚焦于如何利用C#操作Excel文件,包括数据的导入、导出以及进行数据处理。以下是对这些知识点的详细阐述: 一、C#操作Excel的基础 在C#中,我们通常使用Microsoft.Office.Interop.Excel库来与Excel交互。这个...

    C# 操作Excel案例

    本案例聚焦于"C#操作Excel",这涉及到如何使用C#与Microsoft Office的Excel应用程序进行交互,以实现数据读取、写入、修改等操作。在实际工作中,这种技能对于数据处理、报表生成和自动化任务至关重要。 C#操作...

    c#操作Excel并显示到控件上

    总的来说,C#操作Excel并显示到控件上的过程包括了文件读取、数据解析和数据展示三个主要步骤。正确地实现这些步骤,可以构建出强大的数据处理和展示工具。在实际项目中,可能还需要考虑错误处理、性能优化以及用户...

    C#操作EXCEL类

    在C#中,操作Excel是一项常见的任务,尤其在数据分析和报表生成方面。在这个场景中,开发者面临的问题是如何根据动态的数据生成美观且具有自定义图表的Excel报表。由于数据表的数量多,数据量大,以及分析字段的不固...

    [二合一]C#读取和导出EXCEL类库(可操作多个SHEET)

    标题中的 "[二合一]C# 读取和导出 EXCEL 类库(可操作多个 SHEET)" 指的是一个 C# 开发的类库,它整合了读取和导出 Excel 文件的功能...这样的类库对于需要进行 Excel 数据操作的 C# 开发者来说,无疑是一个强大的工具。

    C#操作Excel

    在本场景中,我们关注的是如何使用C#来操作Excel文件,这通常涉及到读取、写入、导入和导出Excel数据,以及与Windows Forms控件如DataGridView的数据交互。以下是对这些知识点的详细说明: 1. **Microsoft.Office....

Global site tag (gtag.js) - Google Analytics