下面進行進階報表設計,該方法的原理為:首先開啟Excel,按照要求排好版,儲存為一個檔案做為模板,然後在C#中將該檔案複製為一個新檔案,在指定位置填入資料就可以了,為了添加表格線,我們錄製了一個宏,在C#中執行該宏即可。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Reflection;
namespace MyExcel
{
/// <summary>
/// Form1 的摘要說明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button btnNormal;
private System.Windows.Forms.Button btnAdvace;
/// <summary>
/// 必需的設計器變數。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 表單設計器支援所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 調用後添加任何建構函式代碼
//
}
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// 設計器支援所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.btnNormal = new System.Windows.Forms.Button();
this.btnAdvace = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btnNormal
//
this.btnNormal.Location = new System.Drawing.Point(49, 55);
this.btnNormal.Name = "btnNormal";
this.btnNormal.TabIndex = 0;
this.btnNormal.Text = "普通報表";
this.btnNormal.Click += new System.EventHandler(this.btnNormal_Click);
//
// btnAdvace
//
this.btnAdvace.Location = new System.Drawing.Point(169, 55);
this.btnAdvace.Name = "btnAdvace";
this.btnAdvace.TabIndex = 1;
this.btnAdvace.Text = "進階報表";
this.btnAdvace.Click += new System.EventHandler(this.btnAdvace_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 133);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.btnAdvace,
this.btnNormal});
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 應用程式的主進入點。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private string [,] myData=
{
{"車牌號","類 型","品 牌","型 號","顏 色","附加費證號","車架號"},
{"JAJAJS","危險品","貨車","鐵風SZG9220YY","白","323232","323232"},
};
//普通報表,即單純的檔案匯出功能
private void btnNormal_Click(object sender, System.EventArgs e)
{
//建立一個Excel檔案
Excel.Application myExcel = new Excel.Application ( ) ;
myExcel.Application.Workbooks.Add ( true ) ;
//讓Excel檔案可見
myExcel.Visible=true;
//第一行為報表名稱
myExcel.Cells[1,4]="普通報表";
//逐行寫入資料,
for(int i=0;i<11;i++)
{
for(int j=0;j<7;j++)
{
//以單引號開頭,表示該儲存格為純文字
myExcel.Cells[2+i,1+j]="'"+myData[i,j];
}
}
}
//進階報表,根據模板產生的報表
private void btnAdvace_Click(object sender, System.EventArgs e)
{
string filename="";
//將模板檔案複製到一個新檔案中
SaveFileDialog mySave=new SaveFileDialog();
mySave.Filter="Excel檔案(*.XLS)|*.xls|所有檔案(*.*)|*.*";
if(mySave.ShowDialog()!=DialogResult.OK)
{
return;
}
else
{
filename=mySave.FileName;
//將模板檔案copy到新位置,建議實際開發時用相對路徑,如Application.StartupPath.Trim()+"\\report\\normal.xls"
string filenameold=mySave.FileName;
FileInfo mode=new FileInfo("d:\\normal.xls");
try
{
mode.CopyTo(filename,true);
}
catch(Exception ee)
{
MessageBox.Show(ee.Message);
return;
}
}
//開啟複製後的檔案
object missing=Missing.Value;
Excel.Application myExcel=new Excel.Application ( );
//開啟新檔案
myExcel.Application.Workbooks.Open(filename,
missing,
missing,
missing,
missing,
missing,
missing,
missing,
missing,
missing,
missing,
missing,
missing);
//將Excel顯示出來
myExcel.Visible=true;
//逐行寫入資料,數組中第一行我欄位標題,忽略
for(int i=1;i<11;i++)
{
for(int j=0;j<7;j++)
{
//以單引號開頭,表示該儲存格為純文字
myExcel.Cells[4+i,1+j]="'"+myData[i,j];
}
}
//將欄位標題和實際內容選中
Excel.Workbook myBook=myExcel.Workbooks[1];
Excel.Worksheet mySheet=(Excel.Worksheet)myBook.Worksheets[1];
Excel.Range r=mySheet.get_Range(mySheet.Cells[3,1],mySheet.Cells[14,7]);
r.Select();
//=====通過執行宏來格表格加邊框=======//
try
{
myExcel.Run("宏1",missing,missing,
missing,missing,missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing);
}
catch
{
}
//儲存修改
myBook.Save();
}
}//end of form
}
在上述代碼中,我們指定了選定範圍:
Excel.Range r=mySheet.get_Range(mySheet.Cells[3,1],mySheet.Cells[14,7]);
具體開發時,我們可以根據資料庫中的實際資料來計算範圍,我們的欄位標題是從.Cells[3,1]開始的,在程式中定死了,為靈活使用,我們完全可以在模板的Cells[1,1]或者其他儲存格填入一些基本資料,如實際資料起始位置等等,操作時,從該儲存格讀入資料,然後將該儲存格內容替換成需要的內容。還有個問題,我們往儲存格中寫內容時假設某列應該放什麼內容,為靈活起見,我們在得到了欄位標題起始位置後,讀入該儲存格內容(即該列應該是什麼欄位),再從資料庫中找到相應的欄位來填充該列,可以保證所填內容與設計的報表對應起來,還可以忽略資料庫中無用的欄位,也就是說同一個資料庫表可以有許多種報表,只要有相應的模板就可以了,讀入某儲存格內容的代碼如下:
Excel.Range r;
r=mySheet.get_Range(mySheet.Cells[2,1],mySheet.Cells[2,1]); //取得值存放的地區
string strValue=r.Value.ToString();
一次只能讀一個儲存格,否則得不到相應的資料,即=mySheet.get_Range(mySheet.Cells[2,1],mySheet.Cells[2,1])中兩個參數都必須是同一個儲存格,本例中為mySheet.Cells[2,1]。