1. 程式人生 > >.Net之路(十四)com組件、OLEDB導入EXCEL

.Net之路(十四)com組件、OLEDB導入EXCEL

進制數 sum ast 方法 The files str source 二進制

版權聲明:本文為博主原創文章,未經博主同意不得轉載。

https://blog.csdn.net/chenfanglincfl/article/details/30546777

.NET com組件


???????這樣的方法在計算機沒有安裝office套件時。也是可以使用的。

所以不依賴於軟件,

可是還是須要xcel.exe編譯後的dll文件打包到對應的程序中來引用。

這樣將dll文件“

隨身攜帶”。就行了。還是挺不錯的!

?

??????1.註冊Microsoft.Office.Interop.Excel.dll

??????

? ? 在office安裝文件夾下找到excel.exe,路徑D:\Program Files(x86)\Microsoft?

Office\Office15.excel.exe文件拷貝到D:\ProgramFiles (x86)\Microsoft Visual

?Studio 11.0\VC下。

visual studio 2012命令行工具切換到D:\Program Files?

(x86)\Microsoft Visual Studio11.0\VC,通常會自己主動切換。

這時候運行TlbImp /

out:Interop.Excel.dll Excel.exe。提示


? ? ? ?技術分享圖片


? ? ? 2.引用interop.excel.dll

??????

? ? ? 將編譯好的dll文件拷貝到程序的bin文件下。

加入引用


? ? ??以下是我自己做的一個小demo

? ? ? ? ??

<pre name="code" class="csharp">private void OpenExcel(string strFileName)
    {
        object missing = System.Reflection.Missing.Value;
        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//lauch excel application
        if (excel == null)
        {
            
        }
        else
        {
            excel.Visible = false;  excel.UserControl = true;
            // 以僅僅讀的形式打開EXCEL文件
            Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing,
             missing, missing, missing, true, missing, missing, missing, missing, missing);
            //取得第一個工作薄
            Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);

            //取得總記錄行數   (包含標題列)
            int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行數
            //int columnsint = mySheet.UsedRange.Cells.Columns.Count;//得到列數

            //取得數據範圍區域  (不包含標題列)
            Range rng1 = ws.Cells.get_Range("B2", "B" + rowsint);   //item

            Range rng2 = ws.Cells.get_Range("K2", "K" + rowsint);  //Customer
            object[,] arryItem= (object[,])rng1.Value2;   //get range‘s value
            object[,] arryCus = (object[,])rng2.Value2; 
            //將新值賦給一個數組
            string[,] arry = new string[rowsint-1, 2];
            for (int i = 1; i <= rowsint-1; i++)
            {
                //Item_Code列
                arry[i - 1, 0] =arryItem[i, 1].ToString();
                //Customer_Name列
                arry[i - 1, 1] = arryCus[i, 1].ToString();
            }
            //Response.Write(arry[0, 0] + "  /  " + arry[0, 1] + "#" + arry[rowsint - 2, 0] + "  /  " + arry[rowsint - 2, 1]);
        }
        excel.Quit();  excel = null;
        Process[] procs = Process.GetProcessesByName("excel");

        foreach (Process pro in procs)
        {
            pro.Kill();//沒有更好的方法,僅僅有殺掉進程
        }
        GC.Collect();
    }

?

結果


??????? 技術分享圖片

?????? 技術分享圖片

?????????




OLEDB方式

????這樣的方式就像平時使用sqlserver一樣。將excel文件當成一個數據源來對待。

僅僅只是

這時候的數據庫是excel罷了,事實上一樣簡單來看sqlserver也就是復雜化的excel所以這

種方式相對還是

比較常見的。

? ? code

? ? ?

<pre name="code" class="csharp">/// <summary>
        /// 讀取Excel數據到DS
        /// </summary>
        /// <param name="excelName">xls文件路徑(服務器物理路徑)string RootDir =Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//獲取程序根文件夾</param>
        /// <returns></returns>
        public DataSet ExcelReader(string excelName)
        {
            // 拼寫連接字符串。打開連接
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + excelName + ";Extended Properties=‘Excel 8.0; HDR=YES; IMEX=1‘";
            OleDbConnection objConn = new OleDbConnection(strConn);
            objConn.Open();
            // 取得Excel工作簿中全部工作表
            DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            OleDbDataAdapter sqlada = new OleDbDataAdapter();
            DataSet ds = new DataSet();

            // 遍歷工作表取得數據並存入Dataset
            foreach (DataRow dr in schemaTable.Rows)
            {
                string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
                OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
                sqlada.SelectCommand = objCmd;
                sqlada.Fill(ds, dr[2].ToString().Trim());
            }


            objConn.Close();
            return ds;
        }

????



? ?幾個關鍵code句:

? ? c#的垃圾回收:

??

   //得到excel全部的進程

     Process[] procs = Process.GetProcessesByName("excel");
     foreach (Process pro in procs)
     {
         pro.Kill();//
      }
     GC.Collect();


????com組件創建excel操作對象

???

  Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); //以僅僅讀的形式打開EXCEL文件
                Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing);
//取得第一個工作薄
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);
//取得單元格的值
String cellstr = ws.Cells[i][j].Value;


?? oledb建立excel連接

??

// 拼寫連接字符串,打開連接
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + excelName + ";Extended Properties=‘Excel 8.0; HDR=YES; IMEX=1‘";
            OleDbConnection objConn = new OleDbConnection(strConn);
objConn.Open();
// 取得Excel工作簿中全部工作表
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);


???

? ? ?第一種方法是創建excel對象,另外一種方法是以excel為數據源。第一種的適用面更

廣。另一種是用二進制數據流的方式來讀取,須要將excel文件轉成csv文件。

.Net之路(十四)com組件、OLEDB導入EXCEL