zoukankan      html  css  js  c++  java
  • SharePoint2013 Excel导出好的代码

    C#Excel操作类ExcelHelper.cs

    来源:http://www.hellocsharp.com/article/67.aspx

    C#源码世界 发布于: 2014-09-12

    使用本类之前必须在本机安装了office excel组件或直接下载Microsoft.Office.Interop.Excel.dll文件引用到项目目录下:

    然后复制下面的类到项目中:

    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 ExcelHelper
    {
        /// <summary>
        /// C#与Excel交互类
        /// </summary>
        public class myExcelHelper
        {
            #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:                       
    returnfalse;               
    }                xlApp
    .Visible=false;//是否在服务器打开                workbook
    .Close(true,Type.Missing,Type.Missing);                workbook
    = null;                xlApp
    .Quit();                xlApp
    = null;               
    returntrue;           
    }           
    catch(Exception)           
    {               
    returnfalse;           
    }       
    }       

    /// <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>       
    publicstaticboolToExcelForDataTableC(System.Data.DataTable dt, string excelPathName, string pathType,List<string> colName, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    List<string> excludeColumn =newList<string>();            string excludeType
    ="0";           
    returnToExcelForDataTable(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>       
    publicstaticboolToExcelForDataTableE(System.Data.DataTable dt, string excelPathName, string pathType,List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    List<string> colName =newList<string>();           
    returnToExcelForDataTable(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>       
    publicstaticboolToExcelForDataTableZ(System.Data.DataTable dt, string excelPathName, string pathType, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    List<string> colName =newList<string>();           
    List<string> excludeColumn =newList<string>();            string excludeType
    ="0";           
    returnToExcelForDataTable(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>       
    publicstaticboolToExcelForModelList<T>(List<T> md, string excelPathName, string pathType,List<string> colName,List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    System.Data.DataTable dt =ModelListToDataTable(md);           
    returnToExcelForDataTable(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>       
    publicstaticboolToExcelForModelListC<T>(List<T> md, string excelPathName, string pathType,List<string> colName, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    List<string> excludeColumn =newList<string>();            string excludeType
    ="0";           
    returnToExcelForModelList(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>       
    publicstaticboolToExcelForModelListE<T>(List<T> md, string excelPathName, string pathType,List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    List<string> colName =newList<string>();           
    returnToExcelForModelList(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>       
    publicstaticboolToExcelForModelListZ<T>(List<T> md, string excelPathName, string pathType, string sheetName, string TemplatePath,intTemplateRow,List<System.Data.DataTable> exDataTableList)       
    {           
    List<string> colName =newList<string>();           
    List<string> excludeColumn =newList<string>();            string excludeType
    ="0";           
    returnToExcelForModelList(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>       
    publicstaticboolToExcelForDataTable(ToExcelModel tem)       
    {           
    if(tem != null)           
    {               
    returnToExcelForDataTable(tem.DataTable, tem.excelPathName, tem.pathType, tem.colNameList, tem.excludeColumn, tem.excludeType, tem.sheetName, tem.TemplatePath, tem.TemplateRow, tem.exDataTableList);           
    }           
    else           
    {               
    returnfalse;           
    }       
    }       
    #endregion       

    #region Model To DataTable       
    /// <summary>       
    /// 实体类转换成DataTable       
    /// </summary>       
    /// <param name="modelList">实体类列表</param>       
    /// <returns></returns>       
    publicstaticSystem.Data.DataTableModelListToDataTable<T>(List<T> modelList)       
    {           
    System.Data.DataTable dtReturn =newSystem.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(newDataColumn(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>       
    publicstaticboolFromExcel(string excelFile, string sheetName, string DbTableName,List<string> columnType, string connectionString)       
    {           
    DataSet ds =newDataSet();           
    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 =newOleDbConnection(strConn))               
    {                    conn
    .Open();                    string strExcel
    ="";                   
    OleDbDataAdapter myCommand = null;                    strExcel
    = string.Format("select * from [{0}$]", sheetName);                    myCommand
    =newOleDbDataAdapter(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 =newSystem.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 =newSystem.Data.SqlClient.SqlBulkCopy(connectionString))                   
    {                        sbc
    .SqlRowsCopied+=newSystem.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)           
    {               
    returnfalse;           
    }           
    returntrue;       
    }       
    #region 进度显示       
    /// <summary>       
    /// 进度显示       
    /// </summary>       
    /// <param name="sender"></param>       
    /// <param name="e"></param>       
    staticvoid bcp_SqlRowsCopied(object sender,System.Data.SqlClient.SqlRowsCopiedEventArgs e)       
    {            e
    .RowsCopied.ToString();       
    }       
    #endregion       
    #endregion   
    }   
    publicclassToExcelModel   
    {       
    #region ToExcelModel自动属性       
    /// <summary>       
    /// 数据表       
    /// </summary>       
    publicSystem.Data.DataTableDataTable{ 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>       
    publicList<string> colNameList { get; set;}       
    /// <summary>       
    /// 要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定       
    /// </summary>       
    publicList<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>       
    publicintTemplateRow{ get; set;}       
    /// <summary>       
    /// 扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同       
    /// </summary>       
    publicList<System.Data.DataTable> exDataTableList { get; set;}       
    #endregion   
    }   
    publicclassFromExcelModel   
    {       
    /// <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>       
    publicList<string> columnTypeList { get; set;}       
    /// <summary>       
    /// 连接字符串 server=serverip;database=databasename;uid=username;pwd=password;       
    /// </summary>       
    public string connectionString { get; set;}   
    }
    }
    该类能够将DataTable直接导出为Excel文件,将List<Model> Model数据实体集合导出到Excel文件,并且提供了直接将Excel数据导出进数据库的方法,还是非常实用的,下面是两个调用示例,注意实际过程中Model和字段这些都是自己定义的,例子中只是一部分核心调用代码:
    /// <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(10, "", "id");
                    System.Data.DataTable dt = ds.Tables[0];
                    List<string> colName = new List<string>() {
                    "用户ID",
                    "用户名",
                    "备注",
                    "用户IP",
                    "操作时间",
                    "操作时间1",
                    "操作时间2"
                    };
                    List<string> tt = new List<string>() { "action_type" };
                    DataSet dss = bll.GetList(10, "", "id");
                    List<System.Data.DataTable> dtss = new List<System.Data.DataTable>();
                    dtss.Add(dss.Tables[0]);
                    dtss.Add(dss.Tables[0]);
                    dtss.Add(dss.Tables[0]);
                    ExcelHelper.ToExcelForDataTable(dt, Server.MapPath("~").ToString() + "456.xlsx", "0", colName, tt, "2", "", "", 0, dtss);//指定了列别名,指定了要排除的列
                    ToExcelModel tem = new ToExcelModel()
                    {
                        DataTable = dt,
                        excelPathName = "",
                        pathType = "0",
                        colNameList = colName,
                        excludeColumn = tt,
                        excludeType = "0",
                        sheetName = "成功",
                        TemplatePath = "",
                        TemplateRow = 0,
                        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# savefiledialog 保存文件后 再操作数据库 提示数据库文件路径错误
    转:在C#中使用Nullable类型
    转:Global.asax通过Application_BeginRequest()事件实现访问链接的静态地址映射
    DZ7.0自动伸缩广告
    转:使用HttpModule来实现sql的防注入
    转:System.Web.UI.Page类的构造函数的执行时机
    使用ISAPI_Rewrite做简单实用的301重定向
    IIS7添加ASP.NET网站碰到的问题
    IE9 崩溃的解决方法
    利用ZEND Studio与Zend server对PHP WEB进行调试
  • 原文地址:https://www.cnblogs.com/TNSSTAR/p/4060661.html
Copyright © 2011-2022 走看看