asp.net(C#)套用模板操作Excel。

当需要输出带大量公式的Excel文档的时候,在代码里写公式就太累了。

  用设计好的Excel模板,复制一下,往里面添加数据比较省事。

  模板

  导出文件:

  大气象

  using System;

  using System.Data;

  using System.Configuration;

  using System.Web;

  using System.Web.Security;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  using System.Web.UI.WebControls.WebParts;

  using System.Web.UI.HtmlControls;

  using System.IO;

  using System.Reflection;

  using Microsoft.Office.Interop.Excel;

  public partial class _Default : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  if (!IsPostBack)

  Bind();

  }

  private void Bind()

  {

  //模板文件

  string TempletFileName = Server.MapPath("template/") + "template.xlsx";

  //导出文件

  string ReportFileName = Server.MapPath("xls/") + "out.xlsx";

  string strTempletFile = Path.GetFileName(TempletFileName);

  //将模板文件复制到输出文件

  FileInfo mode = new FileInfo(TempletFileName);

  mode.CopyTo(ReportFileName, true);

  //打开excel

  object missing = Missing.Value;

  Application app = null;

  Workbook wb = null;

  Worksheet ws = null;

  Range r = null;

  //

  app = new Microsoft.Office.Interop.Excel.Application();

  wb = app.Workbooks.Open(ReportFileName, false, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);

  app.Visible = true;

  //得到WorkSheet对象

  ws = (Worksheet)wb.Worksheets.get_Item(1);

  //添加或修改WorkSheet里的数据

  ws.Cells[1, 1] = "100";

  ws.Cells[2, 1] = "100";

  ws.Cells[2, 2] = "100";

  //代码里写个公式

  r = (Range)ws.Cells[2, 3];

  r.Formula = "=A2*B2";

  //输出Excel文件并退出

  wb.Save();

  wb.Close(null, null, null);

  app.Workbooks.Close();

  app.Application.Quit();

  app.Quit();

  System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);

  System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);

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

  ws = null;

  wb = null;

  app = null;

  }

  }

 

 

 

  1using System;

  2using System.IO;

  3using System.Data;

  4using System.Reflection;

  5using System.Diagnostics;

  6using cfg = System.Configuration;

  7//using Excel;

  8

  9namespace ExcelHelperTest

  10{

  11    /**//// <summary>

  12    /// 功能说明:套用模板输出Excel,并对数据进行分页

  13    /// 作    者:Lingyun_k

  14    /// 创建日期:2005-7-12

  15    /// </summary>

  16    public class ExcelHelper

  17    {

  18        protected string templetFile = null;

  19        protected string outputFile = null;

  20        protected object missing = Missing.Value;

  21

  22        /**//// <summary>

  23        /// 构造函数,需指定模板文件和输出文件完整路径

  24        /// </summary>

  25        /// <param name="templetFilePath">Excel模板文件路径</param>

  26        /// <param name="outputFilePath">输出Excel文件路径</param>

  27        public ExcelHelper(string templetFilePath,string outputFilePath)

  28        {

  29            if(templetFilePath == null)

  30                throw new Exception("Excel模板文件路径不能为空!");

  31

  32            if(outputFilePath == null)

  33                throw new Exception("输出Excel文件路径不能为空!");

  34

  35            if(!File.Exists(templetFilePath))

  36                throw new Exception("指定路径的Excel模板文件不存在!");

  37

  38            this.templetFile = templetFilePath;

  39            this.outputFile = outputFilePath;

  40

  41        }

  42

  43        /**//// <summary>

  44        /// 将DataTable数据写入Excel文件(套用模板并分页)

  45        /// </summary>

  46        /// <param name="dt">DataTable</param>

  47        /// <param name="rows">每个WorkSheet写入多少行数据</param>

  48        /// <param name="top">行索引</param>

  49        /// <param name="left">列索引</param>

  50        /// <param name="sheetPrefixName">WorkSheet前缀名,比如:前缀名为“Sheet”,那么WorkSheet名称依次为“Sheet-1,Sheet-2”</param>

  51        public void DataTableToExcel(DataTable dt,int rows,int top,int left,string sheetPrefixName)

  52        {

  53            int rowCount = dt.Rows.Count;        //源DataTable行数

  54            int colCount = dt.Columns.Count;    //源DataTable列数

  55            int sheetCount = this.GetSheetCount(rowCount,rows);    //WorkSheet个数

  56            DateTime beforeTime;

  57            DateTime afterTime;

  58

  59            if(sheetPrefixName == null || sheetPrefixName.Trim() == "")

  60                sheetPrefixName = "Sheet";

  61

  62            //创建一个Application对象并使其可见

  63            beforeTime = DateTime.Now;

  64            Excel.Application app = new Excel.ApplicationClass();

  65            app.Visible = true;

  66            afterTime = DateTime.Now;

 

  68            //打开模板文件,得到WorkBook对象

  69            Excel.Workbook workBook = app.Workbooks.Open(templetFile,missing,missing,missing,missing,missing,

  70                                missing,missing,missing,missing,missing,missing,missing);

  71

  72            //得到WorkSheet对象

  73            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

  74

  75            //复制sheetCount-1个WorkSheet对象

  76            for(int i=1;i<sheetCount;i++)

  77            {

  78                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing,workBook.Worksheets[i]);

  79            }

  80

  81            将源DataTable数据写入Excel#region 将源DataTable数据写入Excel

  82            for(int i=1;i<=sheetCount;i++)

  83            {

  84                int startRow = (i - 1) * rows;        //记录起始行索引

  85                int endRow = i * rows;            //记录结束行索引

  86

  87                //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数

  88                if(i == sheetCount)

  89                    endRow = rowCount;

  90

  91                //获取要写入数据的WorkSheet对象,并重命名

  92                Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

  93                sheet.Name = sheetPrefixName + "-" + i.ToString();

  94

  95                //将dt中的数据写入WorkSheet

  96                for(int j=0;j<endRow-startRow;j++)

  97                {

  98                    for(int k=0;k<colCount;k++)

  99                    {

  100                        sheet.Cells[top + j,left + k] = dt.Rows[startRow + j][k].ToString();

  101                    }

  102                }

  103

  104                //写文本框数据

  105                Excel.TextBox txtAuthor = (Excel.TextBox)sheet.TextBoxes("txtAuthor");

  106                Excel.TextBox txtDate = (Excel.TextBox)sheet.TextBoxes("txtDate");

  107                Excel.TextBox txtVersion = (Excel.TextBox)sheet.TextBoxes("txtVersion");

  108

  109                txtAuthor.Text = "KLY.NET的Blog";

  110                txtDate.Text = DateTime.Now.ToShortDateString();

  111                txtVersion.Text = "1.0.0.0";

  112            }

  113            #endregion

  114

  115            //输出Excel文件并退出

  116            try

  117            {

  118                workBook.SaveAs(outputFile,missing,missing,missing,missing,missing,Excel.XlSaveAsAccessMode.xlExclusive,missing,missing,missing,missing);

  119                workBook.Close(null,null,null);

  120                app.Workbooks.Close();

  121                app.Application.Quit();

  122                app.Quit();

  123

  124                System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);

  125                System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);

  126                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

  127

  128                workSheet=null;

  129                workBook=null;

  130                app=null;

  131

  132                GC.Collect();

  133            }

  134            catch(Exception e)

  135            {

  136                throw e;

  137            }

  138            finally

  139            {

  140                Process[] myProcesses;

  141                DateTime startTime;

  142                myProcesses = Process.GetProcessesByName("Excel");

  143

  144                //得不到Excel进程ID,暂时只能判断进程启动时间

  145                foreach(Process myProcess in myProcesses)

  146                {

  147                    startTime = myProcess.StartTime;

  148

  149                    if(startTime > beforeTime && startTime < afterTime)

  150                    {

  151                        myProcess.Kill();

  152                    }

  153                }

  154            }

  155

  156        }

  157

  158

 

  159        /**//// <summary>

  160        /// 获取WorkSheet数量

  161        /// </summary>

  162        /// <param name="rowCount">记录总行数</param>

  163        /// <param name="rows">每WorkSheet行数</param>

  164        private int GetSheetCount(int rowCount,int rows)

  165        {

  166            int n = rowCount % rows;        //余数

  167

  168            if(n == 0)

  169                return rowCount / rows;

  170            else

  171                return Convert.ToInt32(rowCount / rows) + 1;

  172        }

  173

  174

  175        /**//// <summary>

  176        /// 将二维数组数据写入Excel文件(套用模板并分页)

  177        /// </summary>

  178        /// <param name="arr">二维数组</param>

  179        /// <param name="rows">每个WorkSheet写入多少行数据</param>

  180        /// <param name="top">行索引</param>

  181        /// <param name="left">列索引</param>

  182        /// <param name="sheetPrefixName">WorkSheet前缀名,比如:前缀名为“Sheet”,那么WorkSheet名称依次为“Sheet-1,Sheet-2”</param>

  183        public void ArrayToExcel(string[,] arr,int rows,int top,int left,string sheetPrefixName)

  184        {

  185            int rowCount = arr.GetLength(0);        //二维数组行数(一维长度)

  186            int colCount = arr.GetLength(1);    //二维数据列数(二维长度)

  187            int sheetCount = this.GetSheetCount(rowCount,rows);    //WorkSheet个数

  188            DateTime beforeTime;

  189            DateTime afterTime;

  190

  191            if(sheetPrefixName == null || sheetPrefixName.Trim() == "")

  192                sheetPrefixName = "Sheet";

  193

  194            //创建一个Application对象并使其可见

  195            beforeTime = DateTime.Now;

  196            Excel.Application app = new Excel.ApplicationClass();

  197            app.Visible = true;

  198            afterTime = DateTime.Now;

  199

  200            //打开模板文件,得到WorkBook对象

  201            Excel.Workbook workBook = app.Workbooks.Open(templetFile,missing,missing,missing,missing,missing,

  202                missing,missing,missing,missing,missing,missing,missing);

  203

  204            //得到WorkSheet对象

  205            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

  206

  207            //复制sheetCount-1个WorkSheet对象

  208            for(int i=1;i<sheetCount;i++)

  209            {

  210                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing,workBook.Worksheets[i]);

  211            }

  212

  213            将二维数组数据写入Excel#region 将二维数组数据写入Excel

  214            for(int i=1;i<=sheetCount;i++)

  215            {

  216                int startRow = (i - 1) * rows;        //记录起始行索引

  217                int endRow = i * rows;            //记录结束行索引

  218

  219                //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数

  220                if(i == sheetCount)

  221                    endRow = rowCount;

  222

  223                //获取要写入数据的WorkSheet对象,并重命名

  224                Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

  225                sheet.Name = sheetPrefixName + "-" + i.ToString();

  226

  227                //将二维数组中的数据写入WorkSheet

  228                for(int j=0;j<endRow-startRow;j++)

  229                {

  230                    for(int k=0;k<colCount;k++)

  231                    {

  232                        sheet.Cells[top + j,left + k] = arr[startRow + j,k];

  233                    }

  234                }

  235

 

  236                Excel.TextBox txtAuthor = (Excel.TextBox)sheet.TextBoxes("txtAuthor");

  237                Excel.TextBox txtDate = (Excel.TextBox)sheet.TextBoxes("txtDate");

  238                Excel.TextBox txtVersion = (Excel.TextBox)sheet.TextBoxes("txtVersion");

  239

  240                txtAuthor.Text = "KLY.NET的Blog";

  241                txtDate.Text = DateTime.Now.ToShortDateString();

  242                txtVersion.Text = "1.0.0.0";

  243            }

  244            #endregion

  245

  246            //输出Excel文件并退出

  247            try

  248            {

  249                workBook.SaveAs(outputFile,missing,missing,missing,missing,missing,Excel.XlSaveAsAccessMode.xlExclusive,missing,missing,missing,missing);

  250                workBook.Close(null,null,null);

  251                app.Workbooks.Close();

  252                app.Application.Quit();

  253                app.Quit();

  254

  255                System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);

  256                System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);

  257                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

  258

  259                workSheet=null;

  260                workBook=null;

  261                app=null;

  262

  263                GC.Collect();

  264            }

  265            catch(Exception e)

  266            {

  267                throw e;

  268            }

  269            finally

  270            {

  271                Process[] myProcesses;

  272                DateTime startTime;

  273                myProcesses = Process.GetProcessesByName("Excel");

  274

  275                //得不到Excel进程ID,暂时只能判断进程启动时间

  276                foreach(Process myProcess in myProcesses)

  277                {

  278                    startTime = myProcess.StartTime;

  279

  280                    if(startTime > beforeTime && startTime < afterTime)

  281                    {

  282                        myProcess.Kill();

  283                    }

  284                }

  285            }

  286

  287        }

  288    }

  289}

你可能感兴趣的:(asp.net)