• 不调用Excel,DataTable导出Excel


      1 class ExportToExcel
      2    {
      3
      4        public void SaveExcel(DataTable dt, string Filter, string FileName, string SheetName)
      5        {
      6
      7            if (FileName == "")
      8            {
      9                SaveFileDialog a = new SaveFileDialog();
     10                a.Filter = "Excel 工作簿 (*.xls)|*.xls";
     11                if (a.ShowDialog() == DialogResult.OK)
     12                {
     13                    FileName = a.FileName;
     14                }

     15                else
     16                {
     17                    return;
     18                }

     19            }

     20
     21            try
     22            {
     23                System.IO.File.Delete(FileName);
     24            }

     25            catch (Exception)
     26            {
     27                MessageBox.Show("该文件已经存在,删除文件时出错!""错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
     28                return;
     29            }

     30
     31            string ConnStr;
     32            ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" + FileName + "\";Extended Properties=\"Excel 8.0;HDR=YES\"";
     33
     34            OleDbConnection conn_excel = new OleDbConnection();
     35            conn_excel.ConnectionString = ConnStr;
     36
     37            OleDbCommand cmd_excel = new OleDbCommand();
     38
     39            string sql;
     40            sql = SqlCreate(dt, SheetName);
     41
     42            conn_excel.Open();
     43            cmd_excel.Connection = conn_excel;
     44            cmd_excel.CommandText = sql;
     45            cmd_excel.ExecuteNonQuery();
     46
     47            conn_excel.Close();
     48
     49            OleDbDataAdapter da_excel = new OleDbDataAdapter("Select * From [" + SheetName + "$]", conn_excel);
     50            DataTable dt_excel = new DataTable();
     51            da_excel.Fill(dt_excel);
     52
     53            da_excel.InsertCommand = SqlInsert(SheetName, dt, conn_excel);
     54
     55            DataRow dr_excel;
     56            string ColumnName;
     57
     58            foreach (DataRow dr in dt.Select(Filter))
     59            {
     60                dr_excel = dt_excel.NewRow();
     61
     62                foreach (DataColumn dc in dt.Columns)
     63                {
     64                    ColumnName = dc.ColumnName; 
     65                    dr_excel[ColumnName] = dr[ColumnName];
     66
     67                }

     68                dt_excel.Rows.Add(dr_excel);
     69
     70            }

     71
     72            da_excel.Update(dt_excel);
     73            conn_excel.Close();
     74
     75            if (MessageBox.Show("数据成功导出到『" + FileName + "』,是否现在打开?""导出",
     76                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
     77            {
     78                System.Diagnostics.Process.Start(FileName);
     79            }

     80        }

     81
     82        private void CheckColumn(DataTable dt, DataTable dt_v)
     83        {
     84            foreach (DataRow dr in dt_v.Select())
     85            {
     86                if (!dt.Columns.Contains(dr["列名"].ToString()))
     87                {
     88                    dr.Delete();
     89                }

     90            }

     91            dt_v.AcceptChanges();
     92        }

     93
     94        private string GetDataType(Type i)
     95        {
     96            string s;
     97
     98            switch (i.Name)
     99            {
    100                case "String":
    101                    s = "Char";
    102                    break;
    103                case "Int32":
    104                    s = "Int";
    105                    break;
    106                case "Int64":
    107                    s = "Int";
    108                    break;
    109                case "Int16":
    110                    s = "Int";
    111                    break;
    112                case "Double":
    113                    s = "Double";
    114                    break;
    115                case "Decimal":
    116                    s = "Double";
    117                    break;
    118                default:
    119                    s = "Char";
    120                    break;
    121
    122            }

    123            return s;
    124        }

    125
    126        private OleDbType StringToOleDbType(Type i)
    127        {
    128            OleDbType s;
    129
    130            switch (i.Name)
    131            {
    132                case "String":
    133                    s =  OleDbType.Char;
    134                    break;
    135                case "Int32":
    136                    s = OleDbType.Integer;
    137                    break;
    138                case "Int64":
    139                    s = OleDbType.Integer;
    140                    break;
    141                case "Int16":
    142                    s = OleDbType.Integer;
    143                    break;
    144                case "Double":
    145                    s = OleDbType.Double;
    146                    break;
    147                case "Decimal":
    148                    s = OleDbType.Decimal;
    149                    break;
    150                default:
    151                    s = OleDbType.Char;
    152                    break;
    153
    154            }

    155            return s;
    156
    157        }

    158
    159
    160        private string SqlCreate(DataTable dt, string SheetName)
    161        {
    162            string sql;
    163
    164            sql = "CREATE TABLE " + SheetName + " (";
    165
    166            foreach (DataColumn dc in dt.Columns)
    167            {
    168                sql += "[" + dc.ColumnName + "" + GetDataType(dc.DataType) + " ,";
    169            }

    170            
    171            //sql = "CREATE TABLE [" + SheetName + "] (";
    172
    173            //foreach (C1.Win.C1TrueDBGrid.C1DataColumn dc in grid.Columns)
    174            //{
    175            //    sql += "[" + dc.Caption + "] " + GetDataType(dc.DataType) + ",";
    176            //}
    177            //sql = sql.Substring(0, sql.Length - 1);
    178            //sql += ")";
    179            
    180            sql = sql.Substring(0, sql.Length - 1);
    181            sql += ")";
    182
    183            return sql;
    184        }

    185
    186
    187        // 生成 InsertCommand 并设置参数
    188        private OleDbCommand SqlInsert(string SheetName, DataTable dt, OleDbConnection conn_excel)
    189        {
    190            OleDbCommand i;
    191            string sql;
    192
    193            sql = "INSERT INTO [" + SheetName + "$] (";
    194            foreach (DataColumn dc in dt.Columns)
    195            {
    196                sql += "[" + dc.ColumnName + "";
    197                sql += ",";
    198            }

    199            sql = sql.Substring(0, sql.Length - 1);
    200            sql += ") VALUES (";
    201            foreach (DataColumn dc in dt.Columns)
    202            {
    203                sql += "?,";
    204            }

    205            sql = sql.Substring(0, sql.Length - 1);
    206            sql += ")";
    207
    208            i = new OleDbCommand(sql, conn_excel);
    209
    210            foreach (DataColumn dc in dt.Columns)
    211            {
    212                i.Parameters.Add("@" + dc.Caption, StringToOleDbType(dc.DataType), 0, dc.Caption);
    213            }

    214
    215            return i;
    216        }

    217   
    218    }
  • 相关阅读:
    影子的宽度&&盒子的个数
    【NOIP2017】【洛谷3958】奶酪cheese(并查集)(dfs)
    【USACO Jan 2011】【洛谷P3008】道路和航线 Roads and Planes
    增肥计划
    【洛谷1379】八数码
    【洛谷1985】【USACO07OPEN】翻转棋
    【NOI1995】极值问题
    车的放置
    【AtCoder
    Design Tutorial: Inverse the Problem
  • 原文地址:https://www.cnblogs.com/pam/p/1287636.html
Copyright © 2020-2023  润新知