此种方式导入Excel,不支持对Excel单元格进行操作
#region 变量
//Excel 2007文件
private static string _connString2007 = string.Empty;
private static string str2007 = @"Provider=Microsoft.ACE.OLEDB.12.0;data source={0};Extended Properties='Excel 12.0 XML;HDR=Yes;'";
//Excel 2003文件
private static string _connString2003 = string.Empty;
private static string str2003 = @"Provider=Microsoft.Jet.OleDb.4.0;data source={0};Extended Properties='Excel 8.0;HDR=Yes;'";
//OleDbConnection对象
private static OleDbConnection _oleDBConn;
#endregion
#region 打开及关闭
/// <summary>
/// 打开Excel链接
/// </summary>
/// <param name="dbName"></param>
public static void OpenExcelDB(string dbName)
{
FileInfo fileInfo = new FileInfo(dbName);
try
{
switch (fileInfo.Extension.ToLower())
{
case ".xls":
_connString2003 = string.Format(str2003, dbName);
_oleDBConn = new OleDbConnection(_connString2003);
break;
case ".xlsx":
_connString2007 = string.Format(str2007, dbName);
_oleDBConn = new OleDbConnection(_connString2007);
break;
default: break;
}
}
catch
{
_oleDBConn = null;
}
}
/// <summary>
/// 关闭Excel链接
/// </summary>
public static void CloseExcelDB()
{
if (_oleDBConn != null && _oleDBConn.State == ConnectionState.Open)
{
_oleDBConn.Close();
_oleDBConn.Dispose();
}
}
#endregion
#region 导出数据到Excel
/// <summary>
/// 创建Excel路径
/// </summary>
public static string OpenSaveFolderBrowserDialog()
{
SaveFileDialog fd = new SaveFileDialog();
fd.Filter = "EXCEL文件(*.xls)|*.xls|EXCEL文件(*.xlsx)|*.xlsx";
fd.FileName = "新建 Microsoft Excel 工作表";
if (fd.ShowDialog() == DialogResult.OK)
{
return fd.FileName;
}
return string.Empty;
}
/// <summary>
/// 创建表头语句
/// </summary>
/// <param name="sheetName">Excel中sheet名</param>
/// <param name="heads">Excel字段名</param>
public static string GetCreateTableCmdText(string sheetName,string[] heads)
{
StringBuilder cmdText = new StringBuilder() ;
cmdText.Append(string.Format("CREATE TABLE [{0}] (", sheetName));
foreach (string headName in heads)
{
cmdText.Append(string.Format("[{0}] VarChar,", headName));
}
cmdText = cmdText.Remove(cmdText.Length - 1, 1);
cmdText.Append(")");
return cmdText.ToString();
}
/// <summary>
/// 创建插值语句
/// </summary>
/// <param name="sheetName">Excel中待插值的sheet名</param>
/// <param name="values">待插入的值</param>
/// <returns></returns>
public static string GetInsertValueCmdText(string sheetName,string[] values)
{
StringBuilder cmdText = new StringBuilder();
cmdText.Append(string.Format("INSERT INTO {0} VALUES (", sheetName));
foreach (string value in values)
{
cmdText.Append(string.Format("'{0}',",value));
}
cmdText = cmdText.Remove(cmdText.Length - 1, 1);
cmdText.Append(")");
return cmdText.ToString();
}
/// <summary>
/// 导出数据到Excel
/// </summary>
/// <param name="sheetName">sheet名</param>
/// <param name="heads">表头</param>
/// <param name="values">于表头对应的值</param>
public static void WriteDataToExcel(string sheetName,string[] heads,List<string[]> values)
{
string filePath = OpenSaveFolderBrowserDialog();
if (string.IsNullOrEmpty(filePath))
{
MessageBox.Show("未获取到正确Excel路径");
return;
}
OpenExcelDB(filePath);
if (_oleDBConn == null)
{
MessageBox.Show("Excel链接失败");
return;
}
_oleDBConn.Open();
OleDbCommand cmd = new OleDbCommand { Connection = _oleDBConn};
try
{
cmd.CommandText = GetCreateTableCmdText(sheetName, heads);
cmd.ExecuteNonQuery();
}
catch (Exception exc)
{
MessageBox.Show(string.Format("表头插入失败: ", exc.Message));
return;
}
StringBuilder valueError = new StringBuilder();
foreach (string[] value in values)
{
try
{
cmd.CommandText = GetInsertValueCmdText(sheetName, value);
cmd.ExecuteNonQuery();
}
catch
{
valueError.Append(string.Format("插值失败 表名:{0} 行数:{1} /n", sheetName, values.IndexOf(value)));
continue;
}
}
if (string.IsNullOrEmpty(valueError.ToString()))
{
MessageBox.Show("导入成功");
}
else
{
MessageBox.Show(valueError.ToString());
}
CloseExcelDB();
}
#endregion