.Net之路(十四)com組件、OLEDB導入EXCEL
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