C#中对Excel进行操作

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

阅读目录

  • 把Excel中的数据导入到数据库中
  • 处理Excel中的数据
  • 导出数据库中的数据到Excel中
  • 总结

回到顶部

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

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

 1 if (FileUpload1.HasFile == false)//HasFile用来检查FileUpload是否有指定文件
 2             {
 3                 Response.Write("<script>alert(‘请您选择Excel文件‘)</script> ");
 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("<script>alert(‘只可以选择Excel文件‘)</script>");
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("<script>alert(‘Excel表为空表,无数据!‘)</script>");   //当Excel表为空时,对用户进行提示
23             }
24             else
25             {
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                         try
46                         {
47                             cmd.ExecuteNonQuery();
48                         }
49                         catch (MembershipCreateUserException ex)       //捕捉异常
50                         {
51                             Response.Write("<script>alert(‘导入内容:" + ex.Message + "‘)</script>");
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 /// <summary>
 8 /// DataChangeExcel 的摘要说明
 9 /// </summary>
10
11     public class DataChangeExcel
12     {
13         /// <summary>
14         /// 数据库转为excel表格
15         /// </summary>
16         /// <param name="dataTable">数据库数据</param>
17         /// <param name="SaveFile">导出的excel文件</param>
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             try
66             {
67                 System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
68                 obj = null;
69             }
70             catch
71             {
72                 obj = null;
73             }
74             finally
75             {
76                 GC.Collect();
77             }
78         }
79     }

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

回到顶部

总结

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

如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。

感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客。

时间: 2024-10-01 06:12:28

C#中对Excel进行操作的相关文章

POI开发:Java中的Excel相关操作

一.Apache POI 1.简介: Apache POI支持大多数中小规模的应用程序开发,提供API给Java程序对Microsoft Office格式档案读和写的功能,呈现和文本提取是它的主要特点. 2.结构: HSSF: 提供读写Microsoft Excel XLS格式档案的功能. XSSF: 提供读写Microsoft Excel OOXML XLSX格式档案的功能. HWPF: 提供读写Microsoft Word DOC格式档案的功能. HSLF: 提供读写Microsoft Po

ASP.NET中的Excel操作(OLEDB方式)

一:OLEDB方式操作Excel的个人理解 就是把要操作的Excel当作一个数据库,所有对Excel的操作,就变成了对“数据库”的操作.那么这时就需要有一个数据库的连接字符串. 代码如下: connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strFileName + ";" + ";Extended Properties=\"Excel 12.0

Asp.Net中Word,Excel等office com组件操作权限的问题

近日在打开原来写的一个网页程序运行时,出现了Excel操作权限的问题,具体的说就是在代码中调用下面这段与Excel操作有关的语句时, Application curExcelApp = new ApplicationClass(); 提示权限不足,具体的提示内容如下: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005. 说明: 执行当前 Web 请求期间,出现未处理的异常.请

报表中的Excel操作之Aspose.Cells(Excel模板)

本文转载:http://www.cnblogs.com/whitewolf/archive/2011/03/21/Aspose_Cells_Template1.html 报表中的Excel操作之Aspose.Cells(Excel模板)

python中Excel表操作

python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls,xlsx# xlwt:写分模块:xls# openpyxl:既能读也能写,只能操作xlsx 所以后面一般操作excel表格最好是使用openpyxl进行操作 # encoding=utf-8 import time import xlrd import xlwt import openpyxl i

在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题

原文:在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题 SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 问题: 消息 15281,级别 16,状态 1,第 1 行 SQL Server 阻止了对组件 'Ad Hoc Di

Delphi中控制Excel(转载)

用Delphi从数据库中取得资料,然后导出到Excel中做成报表是个不错的选择,因为Excel强大的报表功能那可是没话说前提Delphi中要 uses comobj;var Excel:Variant;一.Excel操作1.创建Excel对象Excel := CreateOleObject( Excel.Application );2.显示ExcelExcel.Visible:=true;3.更改标题Excel.Caption:=Excel的标题;4.退出ExcelExcel.Quit;二.工作

ASP.NET中读取excel内容并显示

项目中经常会用到把excel的文件内容导入到数据库中的,刚刚花了点时间,做了个例子,基本上能实现导入Excel后显示的功能吧,导入的excel文件得是xls,即是2003的.     代码思路如下:要读取的excel文件必得得是在本地硬盘,所以一般来说都是让远程用户选择自己硬盘上的Excel文件,然后把用户选择的文件上传到本地服务器上,再在本地服务器上进行操作.我把界面后置代码重要部分贴出来,大家自己慢慢看吧,都有注释了. C#代码   // 上传按钮 protected void btnUp_

java生成Excel及操作Excel

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6