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,但 ...
随机推荐
- 我是一个云Hosts文件,用来干啥你懂的
Smarthosts是一个托管在谷歌代码上的项目,您可以轻松利用本项目使用到一份稳定的Hosts文件. 这份Hosts文件可以帮助您顺利打开一些网站,提高某些国外服务的打开或下载速度. http:// ...
- iOS开发——C篇&函数解析
关于函数,作为一个开发者事必须掌握的知识不管你在那一个领域,所以今天我就来说一说函数. 一:函数的介绍 关于函数,其实笔者在前面都已经演示不少了,其中用的最多的就是main函数,虽然直接说函数可能不太 ...
- android 安卓 微信布局 [1]
微信布局 直接上代码吧 ---------------------------------------- 头部 -------------------------------------------- ...
- 针对苹果最新审核要求为应用兼容IPv6-备用
在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.为确保现有的应用是兼容的,我们需要注意下面几点. 不建议使用底层的网 ...
- obj文件的连接问题以及tlib的基本用法
1.基础研究 用tcc将程序编译为.obj文件. 这里也可以使用tcc -linclude run.c来将run.c文件编译成run.obj文件. 再用tcc对下面的程序进行编译链接,发现提示错误: ...
- 理解i-node
原文链接:http://www.ruanyifeng.com/blog/2011/12/inode.html 感觉讲得挺好,便做个记录.
- HDU_2021——最少RMB问题
Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的 ...
- velocity序列动画
结合上次提到的velocity的UI Pack存在一下问题: 动画名称过长,语意性差 使用UI Pack的动画,loop属性会失效 无法监听动画完成时机 我这里想到了一种解决 ...
- MySQL 遇到的问题:在服务里找不到自己的 MySQL,以及在命令行窗口中运行服务出现的问题。
1.用数据库的时候在服务里找不到自己的 MySQL ,于是就想用命令行窗口去运行. ①.在开始里,键入 cmd ,打开命令行窗口. ②.输入:mysql -u root -p 回车,这时会提示请输入密 ...
- Java继承与清理
[程序实例] import java.util.*; class Characteristic { private String s; Characteristic(String s) { this. ...