2013年5月6日 星期一

{C#} Microsoft.Office.Interop.Excel 引用 匯入Excel


Excel.Application:Excel應用程式
Excel.Workbook:應用程式裡的活頁簿,預設情況下,不管你開幾個Excel檔案,在工作管理員裡只會出現一個Excel.exe
Excel.Worksheet:活頁簿裡的工作表
Excel.Range:工作表裡的儲存格,一格也是Range,多格也是Range,用法Excel.Range[“A1”];
Excel.Range.Cells:這是儲存格的最小單位,代表一格的Range,用法Excel.Range.Cells[1,1];

//是否有Excel.exe 正在執行

void initailExcel()
        {
            //檢查PC有無Excel在執行
            bool flag = false;
            foreach (var item in Process.GetProcesses())
            {
                if (item.ProcessName == "EXCEL")
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                this._Excel = new Excel.Application();
            }
            else
            {
               //引用已在執行的Excel
                object obj = Marshal.GetActiveObject("Excel.Application");
                _Excel = obj as Excel.Application;
            }
            //設false效能會比較好
            this._Excel.Visible = true;
        }



開始讀Excel
  void openExcel(string filepath)
        {
            Excel.Workbook book = null;
            Excel.Worksheet sheet = null;
            Excel.Range range = null;
            DataTable arrdt = null;
            DataSet ds = new DataSet();
            string path = filepath;
            bool flag = false;
            try
            {
                book = _Excel.Workbooks.Open(path);//開啟舊檔案

                var sheetCount =book.Sheets.Count;
                //讀所有Sheet
                for(int i=1;i<=sheetCount;i++)
                {
                    arrdt = new DataTable();
                    sheet = (Excel.Worksheet)book.Sheets[i];
                    //sheet = (Excel.Worksheet)book.Sheets[1];//指定活頁簿,代表Sheet1
                    //sheet = (Excel.Worksheet)book.Sheets["Sheet1"];//也可以直接指定工作表名稱
                    Excel.Range xRange = sheet.UsedRange;
                   
                    //利用obj物件儲存值
                    object[,] valueArray = (object[,])xRange.get_Value(
                      Excel.XlRangeValueDataType.xlRangeValueDefault);

                    if (valueArray.Length > 0)  //陣列資料總個數大於零
                    {
                        int y = valueArray.GetLength(0);  //取得維度1的長度,即列數
                        int x = valueArray.GetLength(1);  //取得維度2的長度,即欄數
                        //建立欄名
                        for (int arri = 1; arri <= x; arri++)
                        {
                            if (valueArray.GetValue(1, arri) != null)
                                arrdt.Columns.Add(valueArray.GetValue(1, arri).ToString());
                            else
                                arrdt.Columns.Add("");

                        }

                        DataRow arrdr;
                        //建立資料
                        for (int arrj = 2; arrj <= y; arrj++)
                        {
                            flag = false;
                            arrdr = arrdt.NewRow();
                            for (int arrk = 1; arrk <= x; arrk++)
                            {
                                arrdr[arrk - 1] = (valueArray.GetValue(arrj, arrk) == null) ? "" : valueArray.GetValue(arrj, arrk).ToString();
                                if (arrdr[arrk - 1].ToString() != "")
                                    flag = true;
                            }
                            if(flag)
                                arrdt.Rows.Add(arrdr);
                        }
                    }
                    ds.Tables.Add(arrdt);
                }

                GridView1.DataSource = ds.Tables[0];
                GridView1.DataBind();
                GridView2.DataSource = ds.Tables[1];
                GridView2.DataBind();
            }
            finally
            {
                book.Close();
                book = null;
            }
        }


來源:
http://www.dotblogs.com.tw/yc421206/archive/2012/03/09/70624.aspx