博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中对Excel进行操作
阅读量:4979 次
发布时间:2019-06-12

本文共 8395 字,大约阅读时间需要 27 分钟。

    工作中要处理一批数据,主要是处理从别处导出来的Excel表格(大概有一千多行,三十多列),拿到表格对Excel表格进行分析,按照一定的规则进行拆分成为一万多行的数据;首先这个需求要用程序进行处理的背景是人工进行拆分已经耗费了一周人天的资源,所以要用C#对数据进行处理,来提高工作效率。开始的想法是把Excel中的数据导入到C#的一个容器中,对容器进行操作,但是拿到规则之后,发现规则太过于复杂,最后的方案变成把Excel数据导入到数据库中,然后,在数据库中进行数据处理,然后再把数据库中的数据导出到Excel表格中。

阅读目录

把Excel中的数据导入到数据库中

在Excel数据到数据库中时,首先要上传这个Excel表格,然后找到数据的sheet页,然后把需要的列数据导入到数据库中,其中要注意Excel版本兼容性的问题。其具体的代码如下:

1 if (FileUpload1.HasFile == false)//HasFile用来检查FileUpload是否有指定文件 2             { 3                 Response.Write(" "); 4                 return;//当无文件时,返回 5             } 6             string IsXls = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();//System.IO.Path.GetExtension获得文件的扩展名 7             if (IsXls != ".xls" && IsXls != ".xlsx") 8             { 9                 Response.Write("");10                 return;//当选择的不是Excel文件时,返回11             }12             SqlConnection cn = new SqlConnection(strConn);13             cn.Open();14             string filename = DateTime.Now.ToString("yyyymmddhhMMss") + FileUpload1.FileName;              //获取Execle文件名  DateTime日期函数15             string savePath = Server.MapPath(("~\\upfiles\\") + filename);//Server.MapPath 获得虚拟服务器相对路径16             FileUpload1.SaveAs(savePath);                        //SaveAs 将上传的文件内容保存在服务器上17             DataSet ds = ExecleDs(savePath, filename);           //调用自定义方法18             DataRow[] dr = ds.Tables[0].Select();            //定义一个DataRow数组19             int rowsnum = ds.Tables[0].Rows.Count;20             if (rowsnum == 0)21             {22                 Response.Write("");   //当Excel表为空时,对用户进行提示23             }24             else25             {26                 for (int i = 3; i < dr.Length; i++)27                 {28                     //获取Excel中的内容并把他们导入到SQL Server数据库中29                     string hhaspx_A = dr[i].ItemArray[0].ToString().Replace("'","");30                     string hhaspx_B = dr[i].ItemArray[1].ToString();31                     string hhaspx_C = dr[i].ItemArray[2].ToString();32                     string hhaspx_D = dr[i].ItemArray[3].ToString();33                     string hhaspx_E = dr[i].ItemArray[4].ToString().Replace("'", "");34                     string hhaspx_H = dr[i].ItemArray[7].ToString();35                     string hhaspx_I = dr[i].ItemArray[8].ToString();36                     string hhaspx_J = dr[i].ItemArray[9].ToString();37                     string hhaspx_N = dr[i].ItemArray[13].ToString().Replace("'", "");38                     string hhaspx_P = dr[i].ItemArray[15].ToString().Replace("'", "");39                     string hhaspx_S = dr[i].ItemArray[18].ToString();40                     string hhaspx_X = dr[i].ItemArray[23].ToString().Replace("'", "");41                     string hhaspx_AB = dr[i].ItemArray[27].ToString();42                     string insertstr = "INSERT INTO dbo.S_DataToExcel ( hhaspx_A , hhaspx_B , hhaspx_C , hhaspx_D , hhaspx_E , hhaspx_H , hhaspx_I , Hhaspx_J , hhaspx_N , hhaspx_P ,  hhaspx_S , hhaspx_X ,  hhaspx_AB)";43                         insertstr += "values ( '" + hhaspx_A + "' , cast('" + hhaspx_B + "' as int) ,cast( '" + hhaspx_C + "' as int) ,cast( '" + hhaspx_D + "' as int),'" + hhaspx_E + "', cast('" + hhaspx_H + "' as int) ,cast('" + hhaspx_I + "' as int),cast( '" + hhaspx_J + "' as int), '" + hhaspx_N + "', '" + hhaspx_P + "' ,  cast('" + hhaspx_S + "' as int), '" + hhaspx_X + "' ,  '" + hhaspx_AB + "')";44                         SqlCommand cmd = new SqlCommand(insertstr, cn);45                         try46                         {47                             cmd.ExecuteNonQuery();48                         }49                         catch (MembershipCreateUserException ex)       //捕捉异常50                         {51                             Response.Write("");52                         }53                    54                 }55             }

 从上传路径的Excel中获取Excel中的数据并装载到相应的容器之中:

1 public DataSet ExecleDs(string filenameurl, string table) 2         { 3             //"Provider=Microsoft.ACE.OLEDB.12.0;"因为Excel存在版本的问题,我们这里选用了“Microsoft.ACE.OLEDB.12.0”用来兼容其他类型的Excel 4             string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + filenameurl + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'"; 5             OleDbConnection conn = new OleDbConnection(strConn); 6             conn.Open(); 7             DataSet ds = new DataSet(); 8             OleDbDataAdapter odda = new OleDbDataAdapter("select * from [Sheet1$]", conn); 9             odda.Fill(ds, table);10             return ds;11         }

如果我们本地的系统中没有安装“Microsoft.ACE.OLEDB.12.0”相关的组件,建议在微软官网进行安装并下载;

处理Excel中的数据

调用数据库的存储过程,把数据按照规则进行转换,并输出转换的结果,存储过程处理数据的部分就不再赘述。

导出数据库中的数据到Excel中

把存储过程转换过后的数据进行获取并放到打他table中导出到Excel表格中。

1  string getDataSql = "EXEC sp_Tools_ExcelTrans";2 3                 SqlCommand cmd1 = new SqlCommand(getDataSql, cn);4                 SqlDataAdapter sda = new SqlDataAdapter(cmd1);5                 DataTable Dt = new DataTable();6                 sda.Fill(Dt);7 8                 //然后把数据进行导出来9                 DataChangeExcel.DataSetToExcel(Dt, Server.MapPath("~\\upfiles\\outputFormDataBase.xls"));

其中把Datatable数据导出到Excel中的方法:

1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Web; 5 using Microsoft.Office.Interop; 6  7 ///  8 /// DataChangeExcel 的摘要说明 9 /// 10 11     public class DataChangeExcel12     {13         /// 14         /// 数据库转为excel表格15         /// 16         /// 数据库数据17         /// 导出的excel文件18         public static void DataSetToExcel(DataTable dataTable, string SaveFile)19         {20             Microsoft.Office.Interop.Excel.Application excel;21             Microsoft.Office.Interop.Excel._Workbook workBook;22             Microsoft.Office.Interop.Excel._Worksheet workSheet;23             object misValue = System.Reflection.Missing.Value;24             excel = new Microsoft.Office.Interop.Excel.ApplicationClass();25             workBook = excel.Workbooks.Add(misValue);26             workSheet = (Microsoft.Office.Interop.Excel._Worksheet)workBook.ActiveSheet;27             int rowIndex = 1;28             int colIndex = 0;29             //取得标题30             foreach (DataColumn col in dataTable.Columns)31             {32                 colIndex++;33                 excel.Cells[1, colIndex] = col.ColumnName;34             }35             //取得表格中的数据36             foreach (DataRow row in dataTable.Rows)37             {38                 rowIndex++;39                 colIndex = 0;40                 foreach (DataColumn col in dataTable.Columns)41                 {42                     colIndex++;43                     excel.Cells[rowIndex, colIndex] =44                          row[col.ColumnName].ToString().Trim();45                     //设置表格内容居中对齐46                       excel.Cells[rowIndex, colIndex]).HorizontalAlignment =47                       Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;48                 }49             }50             excel.Visible = false;51             workBook.SaveAs(SaveFile, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue,52                 misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,53                 misValue, misValue, misValue, misValue, misValue);54             dataTable = null;55             workBook.Close(true, misValue, misValue);56             excel.Quit();57             PublicMethod.Kill(excel);//调用kill当前excel进程58             releaseObject(workSheet);59             releaseObject(workBook);60             releaseObject(excel);61         }62 63         private static void releaseObject(object obj)64         {65             try66             {67                 System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);68                 obj = null;69             }70             catch71             {72                 obj = null;73             }74             finally75             {76                 GC.Collect();77             }78         }79     }

其中”using Microsoft.Office.Interop;“要引入微软Excel的类库:”Microsoft Excel 15.0 Object Library“,并修改其引用库的属性”嵌入互操作类型“为”False“。

总结

有些时候对于Excel表格进行处理,Excel提供了编程在Excel内部对数据列进行处理,但是大部分人对于Excel中的编程不是很熟悉,导致操作起来有一些的困难,如果有一个程序猿(媛)的话,通过程序进行处理那就游刃有余了。

 

 

 

转载于:https://www.cnblogs.com/wustjz/p/4659833.html

你可能感兴趣的文章
Atitit ftp原理与解决方案
查看>>
Atitit 项目的主体设计与结构文档 v3
查看>>
第10章:MongoDB-CRUD操作--文档--修改--修改器
查看>>
mysql备份sql,脚本
查看>>
二进制位处理
查看>>
学术之道-凌晓峰 读书笔记
查看>>
bcp 的一般用法
查看>>
C语言中volatilekeyword的作用
查看>>
Visual Studio 2010 配置Ogre
查看>>
ecstore小记
查看>>
【例3.6】过河卒(Noip2002)
查看>>
Spring 事务入门
查看>>
Codeigniter MongoDB类库
查看>>
Java设计模式——单例模式
查看>>
hdu 2732 Leapin' Lizards(最大流)Mid-Central USA 2005
查看>>
基于lnmp.org的xdebug安装
查看>>
redisTemplate如何注入到ValueOperations
查看>>
增加列并修改列的顺序
查看>>
国庆七天乐 Day2
查看>>
各种图论模型及其解答(转)
查看>>