C#中对Excel进行操作
工作中要处理一批数据,主要是处理从别处导出来的Excel表格(大概有一千多行,三十多列),拿到表格对Excel表格进行分析,按照一定的规则进行拆分成为一万多行的数据;首先这个需求要用程序进行处理的背景是人工进行拆分已经耗费了一周人天的资源,所以要用C#对数据进行处理,来提高工作效率。开始的想法是把Excel中的数据导入到C#的一个容器中,对容器进行操作,但是拿到规则之后,发现规则太过于复杂,最后的方案变成把Excel数据导入到数据库中,然后,在数据库中进行数据处理,然后再把数据库中的数据导出到Excel表格中。
阅读目录
把Excel中的数据导入到数据库中
在Excel数据到数据库中时,首先要上传这个Excel表格,然后找到数据的sheet页,然后把需要的列数据导入到数据库中,其中要注意Excel版本兼容性的问题。其具体的代码如下:
- if (FileUpload1.HasFile == false)//HasFile用来检查FileUpload是否有指定文件
- {
- Response.Write("<script>alert('请您选择Excel文件')</script> ");
- return;//当无文件时,返回
- }
- string IsXls = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();//System.IO.Path.GetExtension获得文件的扩展名
- if (IsXls != ".xls" && IsXls != ".xlsx")
- {
- Response.Write("<script>alert('只可以选择Excel文件')</script>");
- return;//当选择的不是Excel文件时,返回
- }
- SqlConnection cn = new SqlConnection(strConn);
- cn.Open();
- string filename = DateTime.Now.ToString("yyyymmddhhMMss") + FileUpload1.FileName; //获取Execle文件名 DateTime日期函数
- string savePath = Server.MapPath(("~\\upfiles\\") + filename);//Server.MapPath 获得虚拟服务器相对路径
- FileUpload1.SaveAs(savePath); //SaveAs 将上传的文件内容保存在服务器上
- DataSet ds = ExecleDs(savePath, filename); //调用自定义方法
- DataRow[] dr = ds.Tables[].Select(); //定义一个DataRow数组
- int rowsnum = ds.Tables[].Rows.Count;
- if (rowsnum == )
- {
- Response.Write("<script>alert('Excel表为空表,无数据!')</script>"); //当Excel表为空时,对用户进行提示
- }
- else
- {
- for (int i = ; i < dr.Length; i++)
- {
- //获取Excel中的内容并把他们导入到SQL Server数据库中
- string hhaspx_A = dr[i].ItemArray[].ToString().Replace("'","");
- string hhaspx_B = dr[i].ItemArray[].ToString();
- string hhaspx_C = dr[i].ItemArray[].ToString();
- string hhaspx_D = dr[i].ItemArray[].ToString();
- string hhaspx_E = dr[i].ItemArray[].ToString().Replace("'", "");
- string hhaspx_H = dr[i].ItemArray[].ToString();
- string hhaspx_I = dr[i].ItemArray[].ToString();
- string hhaspx_J = dr[i].ItemArray[].ToString();
- string hhaspx_N = dr[i].ItemArray[].ToString().Replace("'", "");
- string hhaspx_P = dr[i].ItemArray[].ToString().Replace("'", "");
- string hhaspx_S = dr[i].ItemArray[].ToString();
- string hhaspx_X = dr[i].ItemArray[].ToString().Replace("'", "");
- string hhaspx_AB = dr[i].ItemArray[].ToString();
- 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)";
- 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 + "')";
- SqlCommand cmd = new SqlCommand(insertstr, cn);
- try
- {
- cmd.ExecuteNonQuery();
- }
- catch (MembershipCreateUserException ex) //捕捉异常
- {
- Response.Write("<script>alert('导入内容:" + ex.Message + "')</script>");
- }
- }
- }
从上传路径的Excel中获取Excel中的数据并装载到相应的容器之中:
- public DataSet ExecleDs(string filenameurl, string table)
- {
- //"Provider=Microsoft.ACE.OLEDB.12.0;"因为Excel存在版本的问题,我们这里选用了“Microsoft.ACE.OLEDB.12.0”用来兼容其他类型的Excel
- string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + filenameurl + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
- OleDbConnection conn = new OleDbConnection(strConn);
- conn.Open();
- DataSet ds = new DataSet();
- OleDbDataAdapter odda = new OleDbDataAdapter("select * from [Sheet1$]", conn);
- odda.Fill(ds, table);
- return ds;
- }
如果我们本地的系统中没有安装“Microsoft.ACE.OLEDB.12.0”相关的组件,建议在微软官网进行安装并下载;
处理Excel中的数据
调用数据库的存储过程,把数据按照规则进行转换,并输出转换的结果,存储过程处理数据的部分就不再赘述。
导出数据库中的数据到Excel中
把存储过程转换过后的数据进行获取并放到打他table中导出到Excel表格中。
- string getDataSql = "EXEC sp_Tools_ExcelTrans";
- SqlCommand cmd1 = new SqlCommand(getDataSql, cn);
- SqlDataAdapter sda = new SqlDataAdapter(cmd1);
- DataTable Dt = new DataTable();
- sda.Fill(Dt);
- //然后把数据进行导出来
- DataChangeExcel.DataSetToExcel(Dt, Server.MapPath("~\\upfiles\\outputFormDataBase.xls"));
其中把Datatable数据导出到Excel中的方法:
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Web;
- using Microsoft.Office.Interop;
- /// <summary>
- /// DataChangeExcel 的摘要说明
- /// </summary>
- public class DataChangeExcel
- {
- /// <summary>
- /// 数据库转为excel表格
- /// </summary>
- /// <param name="dataTable">数据库数据</param>
- /// <param name="SaveFile">导出的excel文件</param>
- public static void DataSetToExcel(DataTable dataTable, string SaveFile)
- {
- Microsoft.Office.Interop.Excel.Application excel;
- Microsoft.Office.Interop.Excel._Workbook workBook;
- Microsoft.Office.Interop.Excel._Worksheet workSheet;
- object misValue = System.Reflection.Missing.Value;
- excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
- workBook = excel.Workbooks.Add(misValue);
- workSheet = (Microsoft.Office.Interop.Excel._Worksheet)workBook.ActiveSheet;
- int rowIndex = ;
- int colIndex = ;
- //取得标题
- foreach (DataColumn col in dataTable.Columns)
- {
- colIndex++;
- excel.Cells[, colIndex] = col.ColumnName;
- }
- //取得表格中的数据
- foreach (DataRow row in dataTable.Rows)
- {
- rowIndex++;
- colIndex = ;
- foreach (DataColumn col in dataTable.Columns)
- {
- colIndex++;
- excel.Cells[rowIndex, colIndex] =
- row[col.ColumnName].ToString().Trim();
- //设置表格内容居中对齐
- excel.Cells[rowIndex, colIndex]).HorizontalAlignment =
- Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
- }
- }
- excel.Visible = false;
- workBook.SaveAs(SaveFile, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue,
- misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
- misValue, misValue, misValue, misValue, misValue);
- dataTable = null;
- workBook.Close(true, misValue, misValue);
- excel.Quit();
- PublicMethod.Kill(excel);//调用kill当前excel进程
- releaseObject(workSheet);
- releaseObject(workBook);
- releaseObject(excel);
- }
- private static void releaseObject(object obj)
- {
- try
- {
- System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
- obj = null;
- }
- catch
- {
- obj = null;
- }
- finally
- {
- GC.Collect();
- }
- }
- }
其中”using Microsoft.Office.Interop;“要引入微软Excel的类库:”Microsoft Excel 15.0 Object Library“,并修改其引用库的属性”嵌入互操作类型“为”False“。
总结
有些时候对于Excel表格进行处理,Excel提供了编程在Excel内部对数据列进行处理,但是大部分人对于Excel中的编程不是很熟悉,导致操作起来有一些的困难,如果有一个程序猿(媛)的话,通过程序进行处理那就游刃有余了。
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客。
C#中对Excel进行操作的更多相关文章
- vbscript 中对excel常见操作
vbs 对excel的操作 删除.修改单元格,设置字体.背景色dim oExcel,oWb,oSheet Set oExcel= CreateObject("Excel.Applicatio ...
- POI开发:Java中的Excel相关操作
一.Apache POI 1.简介: Apache POI支持大多数中小规模的应用程序开发,提供API给Java程序对Microsoft Office格式档案读和写的功能,呈现和文本提取是它的主要特点 ...
- 报表中的Excel操作之Aspose.Cells(Excel模板)
原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...
- 工作中常用的QTP操作Excel函数
前言 本文只是对工作中常用的EOM相关函数的整理,并不是要写个大而全的操作手册,如果想对EOM有更多的了解可以参考QTP的帮助文档或查看QTP安装目录\CodeSamplesPlus\UsingExc ...
- ASP.NET中的Excel操作(OLEDB方式)
一:OLEDB方式操作Excel的个人理解 就是把要操作的Excel当作一个数据库,所有对Excel的操作,就变成了对“数据库”的操作.那么这时就需要有一个数据库的连接字符串. 代码如下: connS ...
- python中Excel表操作
python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls ...
- 网页中NPIO对Excel的操作实例
上一节是在wpf中实现对excel的操作方法,这一节看看网页中如何封装实现对excel的上传导入和下载保存的. 看看效果图:
- python中的excel操作
一. Excel在python中的应用 存测试数据 有的时候大批量的数据,我们需要存到数据库中,在测试的时候才能用到.测试的时候就从数据库中读取出来.这点是非常重要的! 存测试结果 二. Excel中 ...
- POI中HSSF和XSSF操作Excel
POI中HSSF和XSSF操作Excel 在公司实习快一个月了,这段时间公司业务要用JAVA操作复杂的Excel报表.刚开始的Excel还好,没有涉及到复杂的图表,所以使用JXL操作Excel,但 ...
随机推荐
- php本页面调试报错配置
ini_set('display_errors', 'On'); ini_set('memory_limit', '64M'); //报错,详细 error_reporting(E_ALL); //不 ...
- PHP获取指定年份指定月份的天数
最近写接口的时候突然发现的非常实用的php函数,在这儿分享一下: cal_days_in_month(calender,$month,$year): calender:历法,常量,如CAL_GREGO ...
- JS之arguments属性解读函数传参?
Arguments 该对象代表正在执行的函数 和 调用他的函数的参数. arguments属性:为当前执行中的 Function 对象返回 arguments 对象 和 参数. [function.] ...
- C 简单单元测试框架
大约2年前,仿照GTEST写了个简单的C++单元测试框架. http://www.cnblogs.com/imlgc/archive/2012/02/09/2344506.html 后来用C写后台程序 ...
- 开个CS5.4编译编译,调试错误贴
记录各种编译,调试中遇到问题.
- PowerShell控制台输出符号+函数参数类型指定+文本内容读取
There are several ways: Write-Host: Write directly to the console, not included in function/cmdlet o ...
- Linux下根据进程的名字杀死进程
以前是写了一个bash,通过ps,grep 和awk配合搜索PID再kill掉进程.果然以前傻,不知道解决问题之前先google,原来直接就有相关的pkill -f "process_nam ...
- fatal error C1083: Cannot open include file: 'qttreepropertybrowser.moc': No such file or directory
编译QtPropertyBrowser的时候出错.要用moc来生成.moc文件.我好奇的是与之前的通过.h生成moc_xxx.cpp不一样. 要用以下命令.一般来说是处理带Q_OBJECT宏的.h文件 ...
- /dev/urandom
/dev/urandom则是一个非阻塞的发生器: dev/random的一个副本是/dev/urandom (”unlocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据.这 ...
- 【HDOJ】1497 Simple Library Management System
链表. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXM 1001 #def ...