zoukankan      html  css  js  c++  java
  • 使用模板导出Excel【原创】

      
    C#-Doce

    using System;
    using System.Data;
    using System.Diagnostics;
    using System.IO;
    using System.Reflection;

    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">DataSet集合,里面的表个数必须和sheetName数组相等</param>
        /// <param name="rows">每个WorkSheet写入多少行数据</param>
        /// <param name="top">行索引</param>
        /// <param name="left">列索引</param>
        /// <param name="isRrwriteColumn">是否重写列名</param>
        /// <param name="sheetName">WorkSheet名字,必须和DataSet集合里面的DataTable个数对应</param>
        public void DataTableToExcel(DataSet ds, int rows, int top, int left, bool isRrwriteColumn, params string[] sheetName)
        {
            int tableCount = ds.Tables.Count;
            if (tableCount != sheetName.Length)
            {
                throw new Exception("DataTable个数和WorkSheet不匹配");
            }
            DateTime beforeTime;
            DateTime afterTime;

            //创建一个Application对象
            beforeTime = DateTime.Now;
            Excel.Application app = new Excel.ApplicationClass();
            app.Visible = false;
            afterTime = DateTime.Now;

            //打开模板文件
            Excel.Workbook workBook = app.Workbooks._Open(templetFile, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing);

            Excel.Worksheet sheet = null;
            for (int i = 1; i < tableCount; i++)
            {
                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing, workBook.Worksheets[i]);
            }

            #region 将源DataTable数据写入Excel
            DataTable dt = null;
            for (int i = 1; i <= tableCount; i++)
            {
                dt = ds.Tables[i - 1];
                int iRows = dt.Rows.Count, iCols = dt.Columns.Count;
                //获取要写入数据的WorkSheet对象,并重命名
                sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
                sheet.Name = sheetName[i - 1];
                if (isRrwriteColumn)
                {
                    for (int k = 0; k < iCols; k++)
                    {
                        sheet.Cells[1, left + k] = dt.Columns[k].ColumnName;
                    }
                }

                object[,] dataArray = new object[iRows, iCols];
                for (int j = 0; j < iRows; j++)
                {
                    for (int k = 0; k < iCols; k++)
                    {
                        dataArray[j, k] = dt.Rows[j][k];
                    }
                }
                //将dt中的数据写入WorkSheet
                sheet.get_Range(sheet.Cells[top, left], sheet.Cells[iRows, iCols]).Value2 = dataArray;
            }
            #endregion

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

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

                sheet = 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();
                    }
                }
            }
            #endregion
        }
    }

    部分代码参考自:http://www.cnblogs.com/lingyun_k/archive/2005/07/12/191740.aspx

  • 相关阅读:
    centos7下mysql双主+keepalived
    Nginx 性能优化有这篇就够了!
    mysql对自增主键ID进行重新排序
    nginx 配置文件 2019-12-20
    zabbix服务端接收的数据类型,便于编写脚本向服务端提交数据
    zabbix自动注册,实现自动添加机器,减少人工干预
    zabbix企业微信告警配置教程
    websocket 连接测试端口服务是否正常代码
    mongodb Sort排序能够支持的最大内存限制为32M Plan executor error during find: FAILURE
    rabbitmq 的安装配置使用
  • 原文地址:https://www.cnblogs.com/myssh/p/1653392.html
Copyright © 2011-2022 走看看