C# Excel操作类 ExcelHelper
实现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 == ) 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[];
- Microsoft.Office.Interop.Excel.Range range;
- long totalCount = dt.Rows.Count;
- if (exDataTableList != null && exDataTableList.Count > )
- {
- foreach (System.Data.DataTable item in exDataTableList)
- {
- totalCount += item.Rows.Count;
- }
- }
- long rowRead = ;
- float percent = ;
- string exclStr = "";//要排除的列临时项
- object exclType;//DataTable 列的类型,用于做
- int colPosition = ;//列位置
- if (sheetName != null && sheetName != "")
- {
- worksheet.Name = sheetName;
- }
- #region 列别名判定
- if (TemplatePath == "")
- {
- if (colName != null && colName.Count > )
- {
- #region 指定了列别名
- for (int i = ; i < colName.Count; i++)
- {
- worksheet.Cells[, i + ] = colName[i];
- range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ];
- range.Interior.ColorIndex = ;
- range.Font.Bold = true;
- exclType = dt.Columns[i].DataType.Name;
- if (exclType.ToString() != "DateTime")
- {
- //range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.AutoFit();
- }
- else
- {
- //规定列宽
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.ColumnWidth = ;
- }
- //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
- }
- #endregion
- }
- else
- {
- #region 未指定别名
- for (int i = ; i < dt.Columns.Count; i++)
- {
- worksheet.Cells[, i + ] = dt.Columns[i].ColumnName;
- range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ];
- range.Interior.ColorIndex = ;
- range.Font.Bold = true;
- exclType = dt.Columns[i].DataType.Name;
- if (exclType.ToString() != "DateTime")
- {
- //range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.AutoFit();
- }
- else
- {
- //规定列宽
- ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ]).Columns.ColumnWidth = ;
- }
- //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
- }
- #endregion
- }
- }
- else
- {
- //用了模版,不加载标题
- }
- #endregion
- #region 显示/排除列判定
- if (excludeColumn != null && excludeColumn.Count > )
- {
- switch (excludeType)
- {
- case "":
- {
- #region 0为显示所有列
- #region 常规项
- int r = ;
- for (r = ; r < dt.Rows.Count; r++)
- {
- colPosition = ;
- for (int i = ; i < dt.Columns.Count; i++)
- {
- if (TemplatePath == "")
- {
- worksheet.Cells[r + , colPosition + ] = dt.Rows[r][i].ToString();
- }
- else
- {
- worksheet.Cells[r + TemplateRow, colPosition + ] = dt.Rows[r][i].ToString();
- }
- colPosition++;
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- #endregion
- #region 扩展项
- if (exDataTableList != null && exDataTableList.Count > )
- {
- foreach (System.Data.DataTable item in exDataTableList)
- {
- for (int k = ; k < item.Rows.Count; r++, k++)
- {
- colPosition = ;
- //生成扩展 DataTable 每行数据
- for (int t = ; t < item.Columns.Count; t++)
- {
- if (TemplatePath == "")
- {
- worksheet.Cells[r + , colPosition + ] = item.Rows[k][t].ToString();
- }
- else
- {
- worksheet.Cells[r + TemplateRow, colPosition + ] = item.Rows[k][t].ToString();
- }
- colPosition++;
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- }
- }
- #endregion
- #endregion
- }; break;
- case "":
- {
- #region 1指定的为要显示的列
- #region 常规项
- int r = ;
- for (r = ; r < dt.Rows.Count; r++)
- {
- colPosition = ;
- for (int i = ; i < dt.Columns.Count; i++)
- {
- exclStr = dt.Columns[i].ColumnName;
- if (excludeColumn.Contains(exclStr))
- {
- if (TemplatePath == "")
- {
- worksheet.Cells[r + , colPosition + ] = dt.Rows[r][i].ToString();
- }
- else
- {
- worksheet.Cells[r + TemplateRow, colPosition + ] = dt.Rows[r][i].ToString();
- }
- colPosition++;
- }
- else
- {
- }
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- #endregion
- #region 扩展项
- if (exDataTableList != null && exDataTableList.Count > )
- {
- foreach (System.Data.DataTable item in exDataTableList)
- {
- for (int k = ; k < item.Rows.Count; r++, k++)
- {
- colPosition = ;
- //生成扩展 DataTable 每行数据
- for (int t = ; t < item.Columns.Count; t++)
- {
- exclStr = dt.Columns[t].ColumnName;
- if (excludeColumn.Contains(exclStr))
- {
- if (TemplatePath == "")
- {
- worksheet.Cells[r + , colPosition + ] = item.Rows[k][t].ToString();
- }
- else
- {
- worksheet.Cells[r + TemplateRow, colPosition + ] = item.Rows[k][t].ToString();
- }
- colPosition++;
- }
- else
- {
- }
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- }
- }
- #endregion
- #endregion
- }; break;
- case "":
- {
- #region 2指定的为要排除的列
- #region 常规项
- int r = ;
- for (r = ; r < dt.Rows.Count; r++)
- {
- colPosition = ;
- for (int i = ; i < dt.Columns.Count; i++)
- {
- exclStr = dt.Columns[i].ColumnName;
- if (excludeColumn.Contains(exclStr))
- {
- }
- else
- {
- if (TemplatePath == "")
- {
- worksheet.Cells[r + , colPosition + ] = dt.Rows[r][i].ToString();
- }
- else
- {
- worksheet.Cells[r + TemplateRow, colPosition + ] = dt.Rows[r][i].ToString();
- }
- colPosition++;
- }
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- #endregion
- #region 扩展项
- if (exDataTableList != null && exDataTableList.Count > )
- {
- foreach (System.Data.DataTable item in exDataTableList)
- {
- for (int k = ; k < item.Rows.Count; r++, k++)
- {
- colPosition = ;
- //生成扩展 DataTable 每行数据
- for (int t = ; t < item.Columns.Count; t++)
- {
- exclStr = dt.Columns[t].ColumnName;
- if (excludeColumn.Contains(exclStr))
- {
- }
- else
- {
- if (TemplatePath == "")
- {
- worksheet.Cells[r + , colPosition + ] = item.Rows[k][t].ToString();
- }
- else
- {
- worksheet.Cells[r + TemplateRow, colPosition + ] = item.Rows[k][t].ToString();
- }
- colPosition++;
- }
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- }
- }
- #endregion
- #endregion
- }; break;
- default:
- break;
- }
- }
- else
- {
- //生成每行数据
- int r = ;
- for (r = ; r < dt.Rows.Count; r++)
- {
- //生成每列数据
- if (TemplatePath == "")
- {
- for (int i = ; i < dt.Columns.Count; i++)
- {
- worksheet.Cells[r + , i + ] = dt.Rows[r][i].ToString();
- }
- }
- else
- {
- for (int i = ; i < dt.Columns.Count; i++)
- {
- worksheet.Cells[r + + TemplateRow, i + ] = dt.Rows[r][i].ToString();
- }
- }
- rowRead++;
- percent = ((float)( * rowRead)) / totalCount;
- }
- }
- #endregion
- switch (pathType)
- {
- case "": { workbook.Saved = false; }; break;
- case "": { 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 = "";
- 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 = "";
- 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 = "";
- 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 = "";
- 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()[];
- }
- 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 > )
- {
- #region 手动指定定每个字段的数据类型
- //指定数据格式,要求一一对应
- for (int i = ; i < ds.Tables[].Columns.Count; i++)
- {
- System.Data.DataColumn c = ds.Tables[].Columns[i];
- strSql += string.Format("[{0}] {1},", c.ColumnName, columnType[i]);
- }
- #endregion
- }
- else
- {
- #region 使用默认数据类型
- foreach (System.Data.DataColumn c in ds.Tables[].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 = ;//每次传输的行数
- sbc.NotifyAfter = ;//进度提示的行数
- sbc.DestinationTableName = DbTableName != "" ? DbTableName : sheetName;//数据库表名表名
- sbc.WriteToServer(ds.Tables[]);
- }
- #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; }
- }
- }
调用示例:
/// <summary>
/// 导出至Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
try
{
BLL.COMMON_UserInfo cu = new BLL.COMMON_UserInfo();
List<Model.COMMON_UserInfo> cuiList = cu.GetModelList("");
BLL.manager_log bll = new BLL.manager_log();
DataSet ds = bll.GetList(, "", "id");
System.Data.DataTable dt = ds.Tables[];
List<string> colName = new List<string>() {
"用户ID",
"用户名",
"备注",
"用户IP",
"操作时间",
"操作时间1",
"操作时间2"
};
List<string> tt = new List<string>() { "action_type" };
DataSet dss = bll.GetList(, "", "id");
List<System.Data.DataTable> dtss = new List<System.Data.DataTable>();
dtss.Add(dss.Tables[]);
dtss.Add(dss.Tables[]);
dtss.Add(dss.Tables[]);
ExcelHelper.ToExcelForDataTable(dt, Server.MapPath("~").ToString() + "456.xlsx", "", colName, tt, "", "", "", , dtss);//指定了列别名,指定了要排除的列
ToExcelModel tem = new ToExcelModel()
{
DataTable = dt,
excelPathName = "",
pathType = "",
colNameList = colName,
excludeColumn = tt,
excludeType = "",
sheetName = "成功",
TemplatePath = "",
TemplateRow = ,
exDataTableList = dtss
};
ExcelHelper.ToExcelForDataTable(tem);
}
catch (Exception ex)
{
FileLog.Log(ex.Message, "ExportExcelByDataTable");
}
}
/// <summary>
/// 导入数据到数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
string excelFile = "G://123.xls";
string sheetName = "Sheet1";
string DbTableName = "test_new_table";// "test_new_table";
List<string> columnType = new List<string>() {
"int",
"nvarchar(100)",
"decimal(18,2)",
"nvarchar(100)",
"datetime"
};
string connectionString = "server=.;database=Test1;uid=sa;pwd=zhangquan;";
ExcelHelper.FromExcel(excelFile, sheetName, DbTableName, columnType, connectionString);
}
C# Excel操作类 ExcelHelper的更多相关文章
- [.Net] C# Excel操作类 ExcelHelper
实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模 ...
- C#EXCEL 操作类--C#ExcelHelper操作类
主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...
- Excel 操作类
转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...
- C#常用工具类——Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...
- C# Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...
- C#常用工具类——Excel操作类(ZT)
本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html /// 常用工具类——Excel操作类 /// <para> ----- ...
- C#封装的VSTO Excel操作类
自己在用的Excel操作类,因为经常在工作中要操作Excel文件,可是使用vba实现起来实在是不方便,而且编写也很困难,拼接一个字符串都看的眼花. 这个时候C#出现了,发现使用C#来操作Excel非常 ...
- C#自定义Excel操作类
C#自定义Excel操作类,可以用于将DataTable导出到Excel文件,从Excel文件读取数据. using System; using System.IO; using System.Dat ...
- 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)
一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...
随机推荐
- tar 压缩解压
tar命令 tar可以为文件和目录创建档案.利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件, 或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可 ...
- 基于多层感知机的手写数字识别(Tensorflow实现)
import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...
- C#语法之特性
在项目中经常可以看到在类属性上面有一个[]的东西,今天讲的东西就是它,它英文名是Attribute,中文名是特性. 一.什么是特性? 首先,我们肯定Attribute是一个类,下面是msdn文档对它的 ...
- HTTP 无法注册URL 进程不具有命名空间的访问权限
写WCF时在 host.Open(); 报错:HTTP 无法注册 URL http://+:9999/CalculatorService/.进程不具有此命名空间的访问权限(有关详细信息,请参见 htt ...
- windows7 资源管理器无法显示常用
1.windows7 资源管理器无法显示常用 2.windows7 资源管理器无法附加的解决办法. 删除以下文件夹内的所有文件即可%APPDATA%\Microsoft\Windows\Recent\ ...
- WebFrom 【内置对象】— —跳转页面,页面传值
Response -- 响应请求对象 传值 Response.Redirect("url"); -- 地址?变量= 值 Response -- ...
- (译文)The Linux Programming Interface:第1章(历史和标准)
1 HISTORY AND STANDARDS (译者:鱼时代 校对:fgn) Linux 是UNIX操作系统家族中的一员,在计算机出现以来,UNXI已经有很长的历史了.在这一章中的第一部分将对Un ...
- java的锁机制——synchronized
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...
- 在mysql中RIGHT JOIN与group by一起使用引起的一个大bug
本来按理说这个小问题不值得写一个博客的,不过正是这个小问题造成了一个大bug. 本来每月对数据都好好的,但是这一两天突然发现许多数据明显不对,这一块的代码和sql有些不是我写的,不过出现了bug,还是 ...
- VM虚拟机克隆_修改网络
1.如果网络中没有VMware的网卡,记得重置即可 2.如果右上角没有了网络图标,直接 server NetworkManager restart 3.网络配置 1)在/etc/sysconfig/n ...