zoukankan      html  css  js  c++  java
  • C#导入导出操作Excel

    操作Excel有两种方式,一种是IO流的模式操作Excel,优点速度快,跟硬盘读写数据一样,缺点不能设置Excel格式,而想设置Excel格式就得用到组件了。

     1 #region 导出Excel
     2         /// <summary> 
     3         /// 将数据集中的数据导出到EXCEL文件 
     4         /// </summary> 
     5         /// <param name="dataSet">输入数据集</param> 
     6         /// <param name="isShowExcle">是否显示该EXCEL文件</param> 
     7         /// <returns></returns> 
     8         public bool DataSetToExcelThree(DataSet dataSet, bool isShowExcle, string keyword)
     9         {
    10             DataTable dataTable = dataSet.Tables[0];
    11             int rowNumber = dataTable.Rows.Count;//不包括字段名 
    12             int columnNumber = dataTable.Columns.Count;
    13             int colIndex = 0;
    14 
    15             if (rowNumber == 0)
    16             {
    17                 MessageBox.Show("没有任何数据可以导入到Excel文件!");
    18                 return false;
    19             }
    20 
    21             //建立Excel对象 
    22             Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    23             //excel.Application.Workbooks.Add(true); 
    24             Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
    25             Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
    26             excel.Visible = isShowExcle;
    27             //Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.Worksheets[1]; 
    28             Microsoft.Office.Interop.Excel.Range range;
    29 
    30             //生成字段名称 
    31             foreach (DataColumn col in dataTable.Columns)
    32             {
    33                 colIndex++;
    34                 excel.Cells[1, colIndex] = col.ColumnName;
    35             }
    36 
    37             object[,] objData = new object[rowNumber, columnNumber];
    38 
    39             for (int r = 0; r < rowNumber; r++)
    40             {
    41                 for (int c = 0; c < columnNumber; c++)
    42                 {
    43                     objData[r, c] = dataTable.Rows[r][c];
    44                 }
    45                 //Application.DoEvents(); 
    46             }
    47             // 写入Excel 
    48             range = worksheet.Range[worksheet.Cells[2, 1], worksheet.Cells[rowNumber + 1, columnNumber]];
    49             range.Value2 = objData;
    50 
    51             string fileName = @"E:ExcelFile" + keyword + "_" + DateTime.Now.ToString("G").Replace(" ", "_").Replace(@"/", "_").Replace(":", "") + ".xlsx";
    52 
    53             workbook.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    54             try
    55             {
    56                 workbook.Saved = true;
    57                 excel.UserControl = false;
    58                 //excelapp.Quit(); 
    59             }
    60             catch (Exception exception)
    61             {
    62                 MessageBox.Show(exception.Message);
    63             }
    64             finally
    65             {
    66                 workbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlSaveChanges, Missing.Value, Missing.Value);
    67                 excel.Quit();
    68             }
    69 
    70             if (isShowExcle)
    71             {
    72                 System.Diagnostics.Process.Start(fileName);
    73             }
    74             return true;
    75         }
    76         #endregion

    导入Excel批量更新到数据库中

     1 private async void ImportBtn_Click(object sender, EventArgs e)
     2         {
     3             OpenFileDialog openFileDialog = new OpenFileDialog();
     4             openFileDialog.Filter = "Files|*.xls;*.xlsx";  //设置打开文件的后缀类型
     5             openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);//打开我的电脑文件夹
     6             string fileType = ".xls,.xlsx";
     7 
     8             if (openFileDialog.ShowDialog() == DialogResult.OK)
     9             {
    10                 string filePathAndName = openFileDialog.FileName;//文件路径以及文件名
    11                 string fileName = System.IO.Path.GetFileName(filePathAndName); //获取文件名和扩展名
    12                 string fileEx = System.IO.Path.GetExtension(fileName);//获取文件的扩展名
    13                 if (fileType.Contains(fileEx))
    14                 {
    15                     DataSet myDataSet = new DataSet();
    16                     try
    17                     {
    18                         //连接字符串 其中 "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
    19                         //           其中 "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
    20                         string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + filePathAndName + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连接可以操作.xls与.xlsx文件
    21                         OleDbConnection conn = new OleDbConnection(strConn);
    22                         conn.Open();
    23                         //返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等 
    24                         DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
    25                         //包含excel中表名的字符串数组
    26                         string[] strTableNames = new string[dtSheetName.Rows.Count];
    27                         for (int i = 0; i < dtSheetName.Rows.Count; i++)
    28                         {
    29                             strTableNames[i] = dtSheetName.Rows[i]["TABLE_NAME"].ToString();
    30                         }
    31                         OleDbDataAdapter myCommand = null;
    32                         DataTable dt = new DataTable();
    33                         //从指定的表名查询数据,这里选择第一个
    34                         string strExcel = "select * from [" + strTableNames[0] + "]";
    35                         myCommand = new OleDbDataAdapter(strExcel, strConn);
    36                         myCommand.Fill(myDataSet, "ExcelInfo");
    37                         DataTable table = myDataSet.Tables["ExcelInfo"].DefaultView.ToTable();
    38                         //遍历DataTable更新到数据库中;
    39                         var upn = new UnitPrn();
    40                         for (int i = 0; i < table.Rows.Count; i++)
    41                         {
    42                             int a;
    43                             bool b = int.TryParse(table.Rows[i][0].ToString(),out a);
    44                             if(b)
    45                             upn.id =  a;
    46                             upn.EnScopeName = table.Rows[i][1].ToString();
    47                             upn.ChScopeName = table.Rows[i][2].ToString();
    48                             upn.ScopeMarket = table.Rows[i][3].ToString();
    49                             upn.ChScopeMarket = table.Rows[i][4].ToString();
    50                             upn.cestcode = table.Rows[i][5].ToString();
    51                             upn.EnEstateName = table.Rows[i][6].ToString();
    52                             upn.EnPhaseName = table.Rows[i][7].ToString();
    53                             upn.EnAddress = table.Rows[i][8].ToString();
    54                             upn.ChEstateName = table.Rows[i][9].ToString();
    55                             upn.ChPhaseName = table.Rows[i][10].ToString();
    56                             upn.ChAddress = table.Rows[i][11].ToString();
    57                             upn.cblgcode = table.Rows[i][12].ToString();
    58                             upn.EnBuildingName = table.Rows[i][13].ToString();
    59                             upn.ChBuildingName = table.Rows[i][14].ToString();
    60                             upn.cuntcode = table.Rows[i][15].ToString();
    61                             upn.Flat = table.Rows[i][16].ToString();
    62                             upn.Floor = table.Rows[i][17].ToString();
    63                             upn.FlatCn = table.Rows[i][18].ToString();
    64                             upn.FloorCn = table.Rows[i][19].ToString();
    65                             upn.EnStreetName = table.Rows[i][20].ToString();
    66                             upn.EnRoadName = table.Rows[i][21].ToString();
    67                             upn.ChRoadNameCn = table.Rows[i][22].ToString();
    68                             upn.PRN = table.Rows[i][23].ToString();
    69                             upn.Assessment = table.Rows[i][24].ToString();
    70                             upn.ContractAddr = table.Rows[i][25].ToString();
    71                             await DbServices.UpdateDbAllAsync(upn);
    72                         }
    73                     }
    74                     catch (Exception ex)
    75                     {
    76                         MessageBox.Show("" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    77                         throw;
    78                     }
    79                 }
    80                 else
    81                     MessageBox.Show("文件类型不对", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    82             }
    83 
    84             //phase2 to do..
    85         }

    更新数据这里用的是Dapper

    public static async Task<int> UpdateDbAllAsync(UnitPrn unitPrn)
            {
                string sql = $@"update {AppSetting.TableName} set
                                        EnScopeName =@EnScopeName
                                       ,ChScopeName=@ChScopeName
                                       ,ScopeMarket=@ScopeMarket
                                       ,ChScopeMarket=@ChScopeMarket
                                       ,cestcode=@cestcode
                                       ,EnEstateName=@EnEstateName
                                       ,EnPhaseName=@EnPhaseName
                                       ,EnAddress=@EnAddress
                                       ,ChEstateName=@ChEstateName
                                       ,ChPhaseName=@ChPhaseName
                                       ,ChAddress=@ChAddress
                                       ,cblgcode=@cblgcode
                                       ,EnBuildingName=@EnBuildingName
                                       ,ChBuildingName=@ChBuildingName
                                       ,cuntcode=@cuntcode
                                       ,Flat=@Flat
                                       ,Floor=@Floor
                                       ,FlatCn=@FlatCn
                                       ,FloorCn=@FloorCn
                                       ,EnStreetName=@EnStreetName
                                       ,ChStreetName=@ChStreetName
                                       ,EnRoadName=@EnRoadName
                                       ,ChRoadNameCn=@ChRoadNameCn
                                       ,PRN=@PRN
                                       ,Assessment=@Assessment
                                       ,ContractAddr=@ContractAddr where id =@id";
                using (var conn = new SqlConnection(AppSetting.ConnStr))
                {
                    return await conn.ExecuteAsync(sql, unitPrn);
                }
            }

    这里导出到Excel中的输入的是DataSet,数据库操作用的是Dapper,Dapper返回结果没有DataSet的这里需要中转一次,原生的ado.net可以返回DataSet,不用他的原因是Dapper中封装好了异步的方法。

    Dapper查询:

     1 public static async Task<IEnumerable<UnitPrn>> SearchSameBldgAsync(UnitPrn unitPrn)
     2         {
     3             string sql = $@"SELECT  [id] 
     4                                    ,[EnScopeName]
     5                                    ,[ChScopeName]
     6                                    ,[ScopeMarket]
     7                                    ,[ChScopeMarket]
     8                                    ,[cestcode]
     9                                    ,[EnEstateName]
    10                                    ,[EnPhaseName]
    11                                    ,[EnAddress]
    12                                    ,[ChEstateName]
    13                                    ,[ChPhaseName]
    14                                    ,[ChAddress]
    15                                    ,[cblgcode]
    16                                    ,[EnBuildingName]
    17                                    ,[ChBuildingName]
    18                                    ,[cuntcode]
    19                                    ,[Flat]
    20                                    ,[Floor]
    21                                    ,[FlatCn]
    22                                    ,[FloorCn]
    23                                    ,[EnStreetName]
    24                                    ,[ChStreetName]
    25                                    ,[EnRoadName]
    26                                    ,[ChRoadNameCn]
    27                                    ,[PRN]
    28                                    ,[Assessment]
    29                                    ,[ContractAddr]
    30                                     FROM {AppSetting.TableName} where cblgcode = @cblgcode";
    31             using (var conn = new SqlConnection(AppSetting.ConnStr))
    32             {
    33                 return await conn.QueryAsync<UnitPrn>(sql, unitPrn);
    34             }
    35         }

    查询结果IEnumberable转List

    var list = new List<UnitPrn>(Result_Ienumberable);

    List转DataSet

    实现:

    DataSet result = ConvertToDataSet<UnitPrn>(list);

    定义:

     1 #region List<T>转DataSet
     2         public static DataSet ConvertToDataSet<T>(List<T> list)
     3         {
     4             try
     5             {
     6                 if (list == null || list.Count <= 0)
     7                 {
     8                     return null;
     9                 }
    10 
    11                 DataSet ds = new DataSet();
    12                 DataTable dt = new DataTable(typeof(T).Name);
    13                 DataColumn column;
    14                 DataRow row;
    15 
    16                 System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
    17 
    18                 foreach (T t in list)
    19                 {
    20                     if (t == null)
    21                     {
    22                         continue;
    23                     }
    24 
    25                     row = dt.NewRow();
    26 
    27                     for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
    28                     {
    29                         System.Reflection.PropertyInfo pi = myPropertyInfo[i];
    30 
    31                         string name = pi.Name;
    32 
    33                         if (dt.Columns[name] == null)
    34                         {
    35                             column = new DataColumn(name, pi.PropertyType);
    36                             dt.Columns.Add(column);
    37                         }
    38 
    39                         row[name] = pi.GetValue(t, null);
    40                     }
    41 
    42                     dt.Rows.Add(row);
    43                 }
    44                 ds.Tables.Add(dt);
    45                 return ds;
    46             }
    47             catch (Exception er)
    48             {
    49                 throw er;
    50             }
    51         }
    52         #endregion

    整体调用:

    var UpN = new UnitPrn();
                UpN.cblgcode = keyWordBldg;
                var Result_Ienumberable = await DbServices.SearchSameBldgAsync(UpN);
                var list = new List<UnitPrn>(Result_Ienumberable);
                DataSet result = ConvertToDataSet<UnitPrn>(list);
    
                //生成Excel
                DataSetToExcelThree(result, true, "Bldg");

    本来已经完成任务了,但是老大说要用npoi组件,了解了一下npoi优势还是可以的,等改好了再写一篇npoi吧!

    文章来自:

    C#将数据集DataSet中的数据导出到EXCEL文件的几种方法 - qanholas - 博客园 (cnblogs.com)

    C# 中List<T>与DataSet之间的转换 - easten - 博客园 (cnblogs.com)

    (4条消息) .Net C# 如何读取Excel数据内容写入数据库并通过DataGridView控件动态刷新显示_IMZhangZiF的博客-CSDN博客

  • 相关阅读:
    Linux常用命令
    IDEA神器
    Nginx配置文件变量大全
    php-fpm.conf 文件详解
    mysqlsla慢查询分析工具教程
    Nginx upstream的5种权重分配方式
    Nginx简单性能调优
    MySQL 5.5主从同步设置教程
    mongoDB中批量修改字段
    Python学习笔记第四周
  • 原文地址:https://www.cnblogs.com/jf-ace/p/15238110.html
Copyright © 2011-2022 走看看