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

当需要输出带大量公式的Excel文档的时候,在代码里写公式就太累了。
用设计好的Excel模板,复制一下,往里面添加数据比较省事。
模板

导出文件:

ExpandedBlockStart.gif 大气象
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 ;
    }
}

参考:

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

Demo文件下载

  1 using  System;
  2 using  System.IO;
  3 using  System.Data;
  4 using  System.Reflection;
  5 using  System.Diagnostics;
  6 using  cfg  =  System.Configuration;
  7 // using Excel;
  8
  9 namespace  ExcelHelperTest
 10 ExpandedBlockStart.gifContractedBlock.gif {
 11ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 12    /// 功能说明:套用模板输出Excel,并对数据进行分页
 13    /// 作    者:Lingyun_k
 14    /// 创建日期:2005-7-12
 15    /// </summary>

 16    public class ExcelHelper
 17ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 18        protected string templetFile = null;
 19        protected string outputFile = null;
 20        protected object missing = Missing.Value;
 21
 22ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 23        /// 构造函数,需指定模板文件和输出文件完整路径
 24        /// </summary>
 25        /// <param name="templetFilePath">Excel模板文件路径</param>
 26        /// <param name="outputFilePath">输出Excel文件路径</param>

 27        public ExcelHelper(string templetFilePath,string outputFilePath)
 28ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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
 43ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <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)
 52ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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;
 67
 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++)
 77ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 78                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing,workBook.Worksheets[i]);
 79            }

 80
 81ExpandedSubBlockStart.gifContractedSubBlock.gif            将源DataTable数据写入Excel#region 将源DataTable数据写入Excel
 82            for(int i=1;i<=sheetCount;i++)
 83ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 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++)
 97ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 98                    for(int k=0;k<colCount;k++)
 99ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
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
117ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
135ExpandedSubBlockStart.gifContractedSubBlock.gif            {
136                throw e;
137            }

138            finally
139ExpandedSubBlockStart.gifContractedSubBlock.gif            {
140                Process[] myProcesses;
141                DateTime startTime;
142                myProcesses = Process.GetProcessesByName("Excel");
143
144                //得不到Excel进程ID,暂时只能判断进程启动时间
145                foreach(Process myProcess in myProcesses)
146ExpandedSubBlockStart.gifContractedSubBlock.gif                {
147                    startTime = myProcess.StartTime;
148
149                    if(startTime > beforeTime && startTime < afterTime)
150ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
151                        myProcess.Kill();
152                    }

153                }

154            }

155            
156        }

157
158        
159ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
160        /// 获取WorkSheet数量
161        /// </summary>
162        /// <param name="rowCount">记录总行数</param>
163        /// <param name="rows">每WorkSheet行数</param>

164        private int GetSheetCount(int rowCount,int rows)
165ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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
175ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <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)
184ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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++)
209ExpandedSubBlockStart.gifContractedSubBlock.gif            {
210                ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing,workBook.Worksheets[i]);
211            }

212
213ExpandedSubBlockStart.gifContractedSubBlock.gif            将二维数组数据写入Excel#region 将二维数组数据写入Excel
214            for(int i=1;i<=sheetCount;i++)
215ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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++)
229ExpandedSubBlockStart.gifContractedSubBlock.gif                {
230                    for(int k=0;k<colCount;k++)
231ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
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
248ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
266ExpandedSubBlockStart.gifContractedSubBlock.gif            {
267                throw e;
268            }

269            finally
270ExpandedSubBlockStart.gifContractedSubBlock.gif            {
271                Process[] myProcesses;
272                DateTime startTime;
273                myProcesses = Process.GetProcessesByName("Excel");
274
275                //得不到Excel进程ID,暂时只能判断进程启动时间
276                foreach(Process myProcess in myProcesses)
277ExpandedSubBlockStart.gifContractedSubBlock.gif                {
278                    startTime = myProcess.StartTime;
279
280                    if(startTime > beforeTime && startTime < afterTime)
281ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
282                        myProcess.Kill();
283                    }

284                }

285            }

286            
287        }

288    }

289}

290
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值