在C#中利用Excel做進階報表

來源:互聯網
上載者:User

下面進行進階報表設計,該方法的原理為:首先開啟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]。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.