1. 程式人生 > >C#實戰020:OleDb操作-獲取Excel中的sheet工作表

C#實戰020:OleDb操作-獲取Excel中的sheet工作表

          前面用Excel元件寫了一個程式,用來計算市場部的刀具使用明細,但是 發現整個計算過程頻繁的操作Excel表,導致計算時間較長,資料不怎麼多 卻話費了3-4分鐘的計算時間,所以效率太低了。

     所以接下來準備用 OleDb操作來實現這同樣的功能,首先我們來獲取Excel中的所有sheet的工作表,連結資料庫之後通過GetOleDbSchemaTable來獲取Excel中的所有sheet的工作表,然後再將表單進行過濾下存入集合中。之後在遍歷集合就可以得到我們的sheet明細了。

DataTable dt = myCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //獲取所有sheet的工作表
foreach (DataRow row in dt.Rows)
{
    string SheetTableName = row["TABLE_NAME"].ToString();
    if (SheetTableName.Contains("$") && SheetTableName.Replace("'", "").EndsWith("$"))  //過濾無效SheetName  
    {
        SheetTableName = SheetTableName.Replace("'", "");
        SheetTableName = SheetTableName.Substring(0, SheetTableName.Length - 1);
        tableName.Add(SheetTableName);
    }
}
foreach (string sheet in tableName) //迴圈所有的sheet
{
    Console.WriteLine(sheet);
}

下面是完整的程式碼: 

public string ExcelName = @"C:\Users\敏\Desktop\test.xlsx";
public void getExcel()
{
string strConn = "";
List<string> tableName = new List<string>();
if (File.Exists(ExcelName))//判斷檔案是否存在
{
FileInfo file = new FileInfo(ExcelName);//讀取excel檔名
string fileType = file.Extension;//提取excel檔名字尾,判斷檔名型別
//----------------------------獲取Excel表格資料---------------------------
if (fileType == ".xls")
    //讀取“.xls”時使用"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelPath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'" Office 07及以上版本 不能出現多餘的空格 而且分號注意
    strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + ExcelName + @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'";
else
    //讀取“.xlsx”時使用 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelPath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"Office 07以下版本 
    strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" + ExcelName + @";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'";
}
OleDbConnection myCon = new OleDbConnection(strConn);     //連線資料庫    
myCon.Open();//開啟資料庫
DataTable dt = myCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //獲取所有sheet的工作表
foreach (DataRow row in dt.Rows)
{
string SheetTableName = row["TABLE_NAME"].ToString();
if (SheetTableName.Contains("$") && SheetTableName.Replace("'", "").EndsWith("$"))  //過濾無效SheetName  
{
    SheetTableName = SheetTableName.Replace("'", "");
    SheetTableName = SheetTableName.Substring(0, SheetTableName.Length - 1);
    tableName.Add(SheetTableName);
}
}
foreach (string sheet in tableName) //迴圈所有的sheet
{
Console.WriteLine(sheet);
}
}