1. 程式人生 > >OLEDB匯入匯出Excel

OLEDB匯入匯出Excel

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
public static class ExcelHelper
{

#region 匯入

/// <summary>
/// 匯入EXCEL(預設的sheet)
/// </summary>
/// <param name="fileName">excel檔案路徑</param>
/// <returns></returns>
public static System.Data.DataTable ImpExcelDt(string fileName)
{
return ImpExcelDt(fileName, "Sheet1");
}


/// <summary>
/// excel 匯入
/// </summary>
/// <param name="fileName">excel檔案路徑</param>
/// <param name="sheetName"></param>
/// <returns></returns>
public static System.Data.DataTable ImpExcelDt(string fileName, string sheetName)
{
try
{
if (!File.Exists(fileName))
{
return null;
}

// 連線字串:Provider = Microsoft.Jet.OLEDB.4.0; Data Source = d:\test.xls; Extended Properties = 'Excel 8.0;HDR=Yes;IMEX=1;'
//provider:表示提供程式名稱
//Data Source:這裡填寫Excel檔案的路徑
//Extended Properties:設定Excel的特殊屬性
//Extended Properties 取值:
//Excel 8.0 針對Excel2000及以上版本,Excel5.0 針對Excel97。
//HDR = Yes 表示第一行包含列名,在計算行數時就不包含第一行
// IMEX 0:匯入模式,1:匯出模式: 2混合模式

string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [" + sheetName + "$] ";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet, "[" + sheetName + "$]");
myConn.Close();
System.Data.DataTable dt = myDataSet.Tables[0];
return dt;
}
catch (Exception ex)
{
throw ex;
}
}

#endregion

#region 匯出到EXCEL

/// <summary>
/// 將資料匯出到指定的Excel檔案中
/// </summary>
/// <param name="listView">System.Windows.Forms.ListView,指定要匯出的資料來源</param>
/// <param name="destFileName">指定目標檔案路徑</param>
/// <param name="tableName">要匯出到的表名稱</param>
/// <param name="overWrite">指定是否覆蓋已存在的表</param>
/// <returns>匯出的記錄的行數</returns>
public static int ExportToExcel(System.Data.DataTable dt, string destFileName, string tableName)
{
if (File.Exists(destFileName))
{
File.Delete(destFileName);
}

//得到欄位名
string szFields = "";
string szValues = "";
for (int i = 0; i < dt.Columns.Count; i++)
{
szFields += "[" + dt.Columns[i] + "],";
}
szFields = szFields.TrimEnd(',');
//定義資料連線
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = GetConnectionString(destFileName);
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
//開啟資料庫連線
try
{
connection.Open();
}
catch
{
throw new Exception("目標檔案路徑錯誤。");
}

//建立資料庫表
try
{
command.CommandText = GetCreateTableSql("[" + tableName + "]", szFields.Split(','));
command.ExecuteNonQuery();
}
catch (Exception ex)
{
//如果允許覆蓋則刪除已有資料
throw ex;
}
try
{
//迴圈處理資料------------------------------------------
int recordCount = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
szValues = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
szValues += "'" + dt.Rows[i][j] + "',";
}
szValues = szValues.TrimEnd(',');
//組合成SQL語句並執行
string szSql = "INSERT INTO [" + tableName + "](" + szFields + ") VALUES(" + szValues + ")";
command.CommandText = szSql;
recordCount += command.ExecuteNonQuery();
}
connection.Close();
return recordCount;
}
catch (Exception ex)
{
throw ex;
}
}

//得到連線字串
private static String GetConnectionString(string fullPath)
{
string szConnection;
szConnection = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties=Excel 8.0;data source=" + fullPath;
return szConnection;
}

//得到建立表的SQL語句
private static string GetCreateTableSql(string tableName, string[] fields)
{
string szSql = "CREATE TABLE " + tableName + "(";
for (int i = 0; i < fields.Length; i++)
{
szSql += fields[i] + " VARCHAR(200),";
}
szSql = szSql.TrimEnd(',') + ")";
return szSql;
}
#endregion

}
}

 

 

//匯入到資料庫
var getDT= ExcelHelper.ImpExcelDt(@"F:\新建 XLS 工作表 (2).xls");
var rowcount = 0;
for (int i = 0; i < getDT.Rows.Count; i++)
{
var sql = "insert into Users values('";
sql += getDT.Rows[i].ItemArray[1]+"')";
rowcount+=DBHelper.ExecuteNonQuery(sql);
}

//匯入到Excel
var dt = DBHelper.ExecuteDataSet("select * from Users").Tables[0];
var result= ExcelHelper.ExportToExcel(dt, @"F:\新建 XLS 工作表.xls", "Users");
Console.ReadKey();

 

 

 HDR=Yes,這代表第一行是標題,不做為資料使用(但是我在實際使用中,如果第一行存在複雜數值,那麼讀取得到的Datatable列標題會自動設定為F1、F2等方式命名,與實際應用不符,所以當時是通過HDR=No方式將所有內容讀取到Datatable中,然後手動將第一行設定成標題的);IMEX ( IMport EXport mode )設定  IMEX 有三種模式:  0 is Export mode  1 is Import mode  2 is Linked mode (full update capabilities)  我這裡特別要說明的就是 IMEX 引數了,因為不同的模式代表著不同的讀寫行為:  當 IMEX=0 時為“匯出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。  當 IMEX=1 時為“匯入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。  當 IMEX=2 時為“連結模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。

---------------------------------

另外,讀取Excel2007版本的檔案時,版本應該從8.0改為12.0,同時驅動不能再用Jet,而應該用ACE。負責會造成“找不到可安裝的 ISAM”的錯誤。