asp.net(C#)套用模板操作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}
轉載于:https://www.cnblogs.com/onlyzq/archive/2010/08/23/1806310.html
總結
以上是生活随笔為你收集整理的asp.net(C#)套用模板操作Excel。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse rcp 多线程
- 下一篇: JSON In Code