实现C#与Excel文件的交互操作,实现以下功能:

  1、DataTable 导出到 Excel文件

  2、Model数据实体导出到 Excel文件[List<Model>]

  3、导出数据到模版

  4、多DataTable导入到同一Excel文件

    对于第四项功能,常见的用途为:最后一行显示的是百分比,为字符型,而这列其它类型为数据型,如果放在同一个DataTable中,显然不合适。此操作类可实现

  5、将Excel文件导入到数据库表中

    可以指定每个字段的数据类型

  此帮助类的代码量不算少,但注释比较详细,导出数据集中在一个方法,导入数据集中在一个方法。只看完整的两个方法就可以了,其它方法为便于使用所写的辅助简化方法,看看就清楚了:

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using Microsoft.Office.Interop.Excel;
using System.Data;
using System.Reflection;
using System.Data.OleDb; namespace SOSP.Common
{
/// <summary>
/// C#与Excel交互类
/// </summary>
public class ExcelHelper
{
#region 导出到Excel
#region ExportExcelForDataTable
/// <summary>
/// 从DataTable导出Excel,指定列别名,指定要排除的列
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="colName">各列的列名List string </param>
/// <param name="excludeColumn">要显示/排除的列</param>
/// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 例:tp.xlsx 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForDataTable(System.Data.DataTable dt, string excelPathName, string pathType, List<string> colName, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
try
{
if (dt == null || dt.Rows.Count == 0) return false;
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
return false;
}
System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; Microsoft.Office.Interop.Excel.Workbook workbook = null;
if (TemplatePath == "")
{
workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
}
else
{
workbook = workbooks.Add(TemplatePath); //加载模板
}
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
Microsoft.Office.Interop.Excel.Range range; long totalCount = dt.Rows.Count;
if (exDataTableList != null && exDataTableList.Count > 0)
{
foreach (System.Data.DataTable item in exDataTableList)
{
totalCount += item.Rows.Count;
}
}
long rowRead = 0;
float percent = 0;
string exclStr = "";//要排除的列临时项
object exclType;//DataTable 列的类型,用于做
int colPosition = 0;//列位置
if (sheetName != null && sheetName != "")
{
worksheet.Name = sheetName;
}
#region 列别名判定
if (TemplatePath == "")
{
if (colName != null && colName.Count > 0)
{
#region 指定了列别名
for (int i = 0; i < colName.Count; i++)
{
worksheet.Cells[1, i + 1] = colName[i];
range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
range.Interior.ColorIndex = 15;
range.Font.Bold = true;
exclType = dt.Columns[i].DataType.Name;
if (exclType.ToString() != "DateTime")
{
//range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.AutoFit();
}
else
{
//规定列宽
((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
}
//((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
}
#endregion
}
else
{
#region 未指定别名
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
range.Interior.ColorIndex = 15;
range.Font.Bold = true;
exclType = dt.Columns[i].DataType.Name;
if (exclType.ToString() != "DateTime")
{
//range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.AutoFit();
}
else
{
//规定列宽
((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
}
//((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
}
#endregion
}
}
else
{
//用了模版,不加载标题
}
#endregion
#region 显示/排除列判定
if (excludeColumn != null && excludeColumn.Count > 0)
{
switch (excludeType)
{
case "0":
{
#region 0为显示所有列
#region 常规项
int r = 0;
for (r = 0; r < dt.Rows.Count; r++)
{
colPosition = 0;
for (int i = 0; i < dt.Columns.Count; i++)
{
if (TemplatePath == "")
{
worksheet.Cells[r + 2, colPosition + 1] = dt.Rows[r][i].ToString();
}
else
{
worksheet.Cells[r + TemplateRow, colPosition + 1] = dt.Rows[r][i].ToString();
}
colPosition++;
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
#endregion
#region 扩展项
if (exDataTableList != null && exDataTableList.Count > 0)
{
foreach (System.Data.DataTable item in exDataTableList)
{
for (int k = 0; k < item.Rows.Count; r++, k++)
{
colPosition = 0;
//生成扩展 DataTable 每行数据
for (int t = 0; t < item.Columns.Count; t++)
{
if (TemplatePath == "")
{
worksheet.Cells[r + 2, colPosition + 1] = item.Rows[k][t].ToString();
}
else
{
worksheet.Cells[r + TemplateRow, colPosition + 1] = item.Rows[k][t].ToString();
}
colPosition++;
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
}
}
#endregion
#endregion
}; break;
case "1":
{
#region 1指定的为要显示的列
#region 常规项
int r = 0;
for (r = 0; r < dt.Rows.Count; r++)
{
colPosition = 0;
for (int i = 0; i < dt.Columns.Count; i++)
{
exclStr = dt.Columns[i].ColumnName;
if (excludeColumn.Contains(exclStr))
{
if (TemplatePath == "")
{
worksheet.Cells[r + 2, colPosition + 1] = dt.Rows[r][i].ToString();
}
else
{
worksheet.Cells[r + TemplateRow, colPosition + 1] = dt.Rows[r][i].ToString();
}
colPosition++;
}
else
{ }
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
#endregion
#region 扩展项
if (exDataTableList != null && exDataTableList.Count > 0)
{
foreach (System.Data.DataTable item in exDataTableList)
{
for (int k = 0; k < item.Rows.Count; r++, k++)
{
colPosition = 0;
//生成扩展 DataTable 每行数据
for (int t = 0; t < item.Columns.Count; t++)
{
exclStr = dt.Columns[t].ColumnName;
if (excludeColumn.Contains(exclStr))
{
if (TemplatePath == "")
{
worksheet.Cells[r + 2, colPosition + 1] = item.Rows[k][t].ToString();
}
else
{
worksheet.Cells[r + TemplateRow, colPosition + 1] = item.Rows[k][t].ToString();
}
colPosition++;
}
else
{ }
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
}
}
#endregion
#endregion
}; break;
case "2":
{
#region 2指定的为要排除的列
#region 常规项
int r = 0;
for (r = 0; r < dt.Rows.Count; r++)
{
colPosition = 0;
for (int i = 0; i < dt.Columns.Count; i++)
{
exclStr = dt.Columns[i].ColumnName;
if (excludeColumn.Contains(exclStr))
{ }
else
{
if (TemplatePath == "")
{
worksheet.Cells[r + 2, colPosition + 1] = dt.Rows[r][i].ToString();
}
else
{
worksheet.Cells[r + TemplateRow, colPosition + 1] = dt.Rows[r][i].ToString();
}
colPosition++;
}
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
#endregion
#region 扩展项
if (exDataTableList != null && exDataTableList.Count > 0)
{
foreach (System.Data.DataTable item in exDataTableList)
{
for (int k = 0; k < item.Rows.Count; r++, k++)
{
colPosition = 0;
//生成扩展 DataTable 每行数据
for (int t = 0; t < item.Columns.Count; t++)
{
exclStr = dt.Columns[t].ColumnName;
if (excludeColumn.Contains(exclStr))
{ }
else
{
if (TemplatePath == "")
{
worksheet.Cells[r + 2, colPosition + 1] = item.Rows[k][t].ToString();
}
else
{
worksheet.Cells[r + TemplateRow, colPosition + 1] = item.Rows[k][t].ToString();
}
colPosition++;
}
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
}
}
#endregion
#endregion
}; break;
default:
break;
} }
else
{
//生成每行数据
int r = 0;
for (r = 0; r < dt.Rows.Count; r++)
{
//生成每列数据
if (TemplatePath == "")
{
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString();
}
}
else
{
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cells[r + 1 + TemplateRow, i + 1] = dt.Rows[r][i].ToString();
}
}
rowRead++;
percent = ((float)(100 * rowRead)) / totalCount;
}
}
#endregion
switch (pathType)
{
case "0": { workbook.Saved = false; }; break;
case "1": { workbook.Saved = true; workbook.SaveCopyAs(excelPathName); }; break;
default:
return false;
}
xlApp.Visible = false;//是否在服务器打开
workbook.Close(true, Type.Missing, Type.Missing);
workbook = null;
xlApp.Quit();
xlApp = null;
return true;
}
catch (Exception)
{
return false;
}
} /// <summary>
/// 从DataTable导出Excel,指定列别名
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="colName">各列的列名List string </param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForDataTableC(System.Data.DataTable dt, string excelPathName, string pathType, List<string> colName, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
List<string> excludeColumn = new List<string>();
string excludeType = "0";
return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
} /// <summary>
/// 从DataTable导出Excel,指定要排除的列
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="excludeColumn">要显示/排除的列</param>
/// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForDataTableE(System.Data.DataTable dt, string excelPathName, string pathType, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
List<string> colName = new List<string>();
return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
}
/// <summary>
/// 从DataTable导出Excel,使用默认列名,不排除导出任何列
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForDataTableZ(System.Data.DataTable dt, string excelPathName, string pathType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
List<string> colName = new List<string>();
List<string> excludeColumn = new List<string>();
string excludeType = "0";
return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
}
#endregion #region ExportExcelForModelList
/// <summary>
/// 从DataTable导出Excel,指定列别名,指定要排除的列
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="colName">各列的列名List string </param>
/// <<param name="excludeColumn">要显示/排除的列</param>
/// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForModelList<T>(List<T> md, string excelPathName, string pathType, List<string> colName, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
System.Data.DataTable dt = ModelListToDataTable(md);
return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
} /// <summary>
/// 从DataTable导出Excel,指定列别名
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="colName">各列的列名List string </param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForModelListC<T>(List<T> md, string excelPathName, string pathType, List<string> colName, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
List<string> excludeColumn = new List<string>();
string excludeType = "0";
return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
} /// <summary>
/// 从DataTable导出Excel,指定要排除的列
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="excludeColumn">要显示/排除的列</param>
/// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForModelListE<T>(List<T> md, string excelPathName, string pathType, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
List<string> colName = new List<string>();
return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
} /// <summary>
/// 从DataTable导出Excel,使用默认列名,不排除导出任何列
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
/// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
/// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
/// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
/// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
/// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
/// <returns>bool</returns>
public static bool ToExcelForModelListZ<T>(List<T> md, string excelPathName, string pathType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
{
List<string> colName = new List<string>();
List<string> excludeColumn = new List<string>();
string excludeType = "0";
return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
}
#endregion #region 从DataTable导出Excel; ToExcelModel实体传参
/// <summary>
/// 从DataTable导出Excel; ToExcelModel实体传参
/// </summary>
/// <param name="tem">ExcelHelper.ToExcelModel</param>
/// <returns></returns>
public static bool ToExcelForDataTable(ToExcelModel tem)
{
if (tem != null)
{
return ToExcelForDataTable(tem.DataTable, tem.excelPathName, tem.pathType, tem.colNameList, tem.excludeColumn, tem.excludeType, tem.sheetName, tem.TemplatePath, tem.TemplateRow, tem.exDataTableList);
}
else
{
return false;
}
}
#endregion #region Model To DataTable
/// <summary>
/// 实体类转换成DataTable
/// </summary>
/// <param name="modelList">实体类列表</param>
/// <returns></returns>
public static System.Data.DataTable ModelListToDataTable<T>(List<T> modelList)
{
System.Data.DataTable dtReturn = new System.Data.DataTable(); // column names
PropertyInfo[] oProps = null; if (modelList == null) return dtReturn; foreach (T rec in modelList)
{
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
== typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
} dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
} DataRow dr = dtReturn.NewRow(); foreach (PropertyInfo pi in oProps)
{
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
(rec, null);
} dtReturn.Rows.Add(dr);
}
return dtReturn;
}
#endregion #region 说明 如何使用
/*
* 功能:
* 1、将System.Data.DataTable数据导出到Excel文件
* 2、将Model(Entity)数据实体导出到Excel文件
* 完整调用:
* 1、ExcelHelper.ToExcelForDataTable(DataTable,excelPathName,pathType,colName,excludeColumn,excludeType,sheetName,TemplatePath,TemplateRow,exDataTableList);
* 2、ExcelHelper.ToExcelForModelList(Model,excelPathName,pathType,colName,excludeColumn,excludeType,sheetName,TemplatePath,TemplateRow,exDataTableList);
* 参数说明:
* 1、DataTable:DataSet.DataTable[0];数据表
* 2、Model:Model.Users users = new Model.Users(){...};数据实体
* 3、excelPathName:含Excel名称的保存路径 在pathType=1时有效。用户自定义保存路径时请赋值空字符串 ""。格式:"E://456.xlsx"
* 4、pathType:路径类型。只能取值:0用户自定义路径,弹出用户选择路径对话框;1服务端定义路径。标识文件保存路径是服务端指定还是客户自定义路径及文件名,与excelPathName参数合用
* 5、colName:各列的列别名List string,比如:字段名为userName,此处可指定为"用户名",并以此显示
* 6、excludeColumn:要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定
* 7、excludeType:显示/排除列方式。 0为显示所有列 1指定的是要显示的列 2指定的是要排除的列,与excludeColumn合用
* 8、sheetName:sheet1的名称,要使期保持默认名称请指定为空字符串 ""
* 9、TemplatePath:模版在项目服务器中路径 例:tp.xlsx 。当为空字符串 "" 时表示无模版
* 10、TemplateRow:模版中已存在数据的行数,与TemplatePath合用,无模版时请传入参数 0
* 11、exDataTableList:扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同
* 注意:
* 1、exDataTableList参数为一个List<System.Data.DataTable> 集合,当数据为 Model 时,可先调用 ExcelHelper.ModelListToDataTable(System.Data.DataTable dt)将Model转为System.Data.DataTable
*/
#endregion
#endregion
#region 从Excel导入数据到 Ms Sql
/// <summary>
/// 从Excel导入数据到 Ms Sql
/// </summary>
/// <param name="excelFile">Excel文件路径(含文件名)</param>
/// <param name="sheetName">sheet名</param>
/// <param name="DbTableName">存储到数据库中的数据库表名称</param>
/// <param name="columnType">对应表格的数据类型,如果为null,则为默认类型:double,nvarchar(500),datetime</param>
/// <param name="connectionString">连接字符串</param>
/// <returns></returns>
public static bool FromExcel(string excelFile, string sheetName, string DbTableName, List<string> columnType, string connectionString)
{
DataSet ds = new DataSet();
try
{
//获取全部数据
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFile + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连
#region 知识扩展
//HDR=Yes,代表第一行是标题,不做为数据使用。HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
//IMEX=0 只读模式
//IMEX=1 写入模式
//IMEX=2 可读写模式
#endregion
#region 命名执行
using (OleDbConnection conn = new OleDbConnection(strConn))
{
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
strExcel = string.Format("select * from [{0}$]", sheetName);
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, sheetName); #region 数据库表是否存在的 T-SQL 检测语句准备
//如果目标表不存在则创建
string strSql = string.Format("if object_id('{0}') is null create table {0}(", DbTableName != "" ? DbTableName : sheetName);
if (columnType != null && columnType.Count > 0)
{
#region 手动指定定每个字段的数据类型
//指定数据格式,要求一一对应
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
System.Data.DataColumn c = ds.Tables[0].Columns[i];
strSql += string.Format("[{0}] {1},", c.ColumnName, columnType[i]);
}
#endregion
}
else
{
#region 使用默认数据类型
foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
{
//使用默认格式:只有double,DateTime,String三种类型
switch (c.DataType.ToString())
{
case "DateTime":
{
strSql += string.Format("[{0}] DateTime,", c.ColumnName);
}; break;
case "Double":
{
strSql += string.Format("[{0}] double,", c.ColumnName);
}; break;
default:
strSql += string.Format("[{0}] nvarchar(500),", c.ColumnName);
break;
}
}
#endregion
}
strSql = strSql.Trim(',') + ")";
#endregion
#region 执行 T-SQL 如果数据库表不存在则新建表,如果存在则不新建
using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
{
sqlconn.Open();
System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
command.CommandText = strSql;
command.ExecuteNonQuery();
sqlconn.Close();
}
#endregion
#region 向数据库表插入数据
using (System.Data.SqlClient.SqlBulkCopy sbc = new System.Data.SqlClient.SqlBulkCopy(connectionString))
{
sbc.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
sbc.BatchSize = 100;//每次传输的行数
sbc.NotifyAfter = 100;//进度提示的行数
sbc.DestinationTableName = DbTableName != "" ? DbTableName : sheetName;//数据库表名表名
sbc.WriteToServer(ds.Tables[0]);
}
#endregion
}
#endregion
}
catch (Exception ex)
{
return false;
}
return true;
}
#region 进度显示
/// <summary>
/// 进度显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
{
e.RowsCopied.ToString();
}
#endregion
#endregion
}
public class ToExcelModel
{
#region ToExcelModel自动属性
/// <summary>
/// 数据表
/// </summary>
public System.Data.DataTable DataTable { get; set; }
/// <summary>
/// 含Excel名称的保存路径 在pathType=1时有效。用户自定义保存路径时请赋值空字符串 ""。格式:"E://456.xlsx"
/// </summary>
public string excelPathName { get; set; }
/// <summary>
/// 路径类型。只能取值:0用户自定义路径,弹出用户选择路径对话框;1服务端定义路径。标识文件保存路径是服务端指定还是客户自定义路径及文件名,与excelPathName参数合用
/// </summary>
public string pathType { get; set; }
/// <summary>
/// 各列的列别名List string,比如:字段名为userName,此处可指定为"用户名",并以此显示
/// </summary>
public List<string> colNameList { get; set; }
/// <summary>
/// 要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定
/// </summary>
public List<string> excludeColumn { get; set; }
/// <summary>
/// 显示/排除列方式。 0为显示所有列 1指定的是要显示的列 2指定的是要排除的列,与excludeColumn合用
/// </summary>
public string excludeType { get; set; }
/// <summary>
/// sheet1的名称,要使期保持默认名称请指定为空字符串 ""
/// </summary>
public string sheetName { get; set; }
/// <summary>
/// 模版在项目服务器中路径 例:tp.xlsx 。当为空字符串 "" 时表示无模版
/// </summary>
public string TemplatePath { get; set; }
/// <summary>
/// 模版中已存在数据的行数,与TemplatePath合用,无模版时请传入参数 0
/// </summary>
public int TemplateRow { get; set; }
/// <summary>
/// 扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同
/// </summary>
public List<System.Data.DataTable> exDataTableList { get; set; }
#endregion
}
public class FromExcelModel
{
/// <summary>
/// Excel文件路径(含文件名)
/// </summary>
public string excelFile { get; set; }
/// <summary>
/// sheet名<
/// </summary>
public string sheetName { get; set; }
/// <summary>
/// 存储到数据库中的数据库表名称
/// </summary>
public string DbTableName { get; set; }
/// <summary>
/// 对应表格的数据类型,如果为null,则为默认类型:double,nvarchar(500),datetime
/// </summary>
public List<string> columnTypeList { get; set; }
/// <summary>
/// 连接字符串 server=serverip;database=databasename;uid=username;pwd=password;
/// </summary>
public string connectionString { get; set; }
}
}

调用示例:

 
 

最新文章

  1. python IDLE编程时遇到Python Error: Inconsistent indentation detected! 解决方法
  2. 从全局中通过class类名获取标签
  3. 干净的卸载Oracle
  4. try-catch-finally中return语句的执行
  5. js动态添加事件
  6. Winform webBrowser 不跳转网页
  7. marquee标签制作轮播图
  8. bzoj1455
  9. HTML基础知识笔记(三)
  10. IE WebDriver 因保护模式无法启动的解决 (转载)
  11. html object元素
  12. Modis 陆地产品格网
  13. Java 工具类—日期获得,随机数,系统命令,数据类型转换
  14. python文件处理相关函数
  15. js随机出现2个数字
  16. Nginx配置文件nginx.conf中文详解(转)
  17. Swift NSAttributedString的使用
  18. 尽量避免把弹窗加在window上,可以考虑把弹窗封装到控制器里面
  19. centos 7创建ss服务(方式一)
  20. Vuejs——(9)组件——props数据传递

热门文章

  1. xdoj 1067组合数学+动态规划 (一个题断断续续想了半年 233)
  2. rcnn系列
  3. thinkphp error:no database select
  4. CentOS7.1 KVM虚拟化之环境准备
  5. MySQL Binlog和Relaylog生成和清理
  6. dive 方便的观察容器各层信息的工具
  7. MySql安装完成后,Navicat连接不上的问题
  8. python之路---06 小数据池 编码
  9. 【转】Vue生命周期
  10. LOJ 2339 「WC2018」通道——边分治+虚树