在工作中我们常常遇到Excel表格,不管是数据的导入导出,还是财务统计什么都,都离不开ExcelExcel是我见过的最牛逼的一个软件(可能我的见识少)没有之一;如果你只停留在Excel处理数据,统计数据的层面,那么我想说,你比我的见识还少(你要是不服,不服就算了)。Excel不仅仅是统计数据,处理数据还可以画画,制作flash动画etc。

好了,言归正传,我是一名程序员,入行也就几年,见识和高度也都还停留在表现层,非要问我出处,我只能说四川某高校。其实我想写这个博客已经很久了,公司里面内部博客已经写完,但是遇到一个不能访问外网的公司我也醉了(信息安全)。大体要讲的就是我们平时工作中常用的几种方式来处理Excel(其实也就是我工作中用到的几种方式)。

1、传统的采用Office.Interop

其实要说Office.Interop这个不管从那个方面,应该算比较好也比较直接操作Excel,各种样式什么的肯定是必须支持,毕竟是自家产品不能被打脸,不是么?但是,我这里说说不好的情况。首先你本地必须安装MS Office,为啥呢?我们用C#调用的时候,是调用Office自己的组件,需要依赖Office如若不安装那肯定是玩不转的。另外,这是我在工作中踩过坑的,那就是你还必须激活,没错是激活。没有激活会爆出一些底层提示,查询了各种资料发现,这鬼居然要激活采能够用,orz!!!

原本这里应该有Code的,不是我懒,而是如果采用Office.Interop组件操作Excel网上比比皆是,如果需要可以私信给我,我可以加上。

  

2、采用NPOI

话说NPOI,这是一个开源组件,是仿POI,如果有Java的同学应该知道,Java里面操作Excel就是用的POI(可能这里会出现调侃点),NPOI操作Excel和Office.Interop操作Excel有什么地方不一样呢?首先,也是主要的,你不需要安装Office。想想,我做一个网站,其实就是想将数据导出Excel给用户,我服务器上面难道还要安装一个Office,就是方便为了处理数据给用户?这其实没有必要嘛,再说虽然网上有N多破解版什么激活码什么的,单单Office就有800+M,毕竟空间还是比较贵嘛,所以基于综上我觉得NPOI就可以了。NPOI操作Excel读取写入数据什么的都是没有问题,样式什么的也肯定支持。以前的NPOI只支持Office2003,现在可以支持更高版本了。

http://www.cnblogs.com/luxiaoxun/p/3374992.html 这是园子中另一个同学关于NPOI和Aspose.Cell的一个介绍。

3、采用Aspose.Cell

[Aspose.Cells是一款功能强大的Excel文档处理和转换控件,开发人员和客户电脑无需安装Microsoft Excel也能在应用程序中实现类似Excel的强大数据管理功能,支持所有Excel格式类型的操作,在没有Microsoft Excel的环境下,用户也可为其应用程序嵌入类似Excel的强大数据管理功能。Aspose.Cells可以对每一个具体的数据,表格和格式进行管理,在各个层面导入图像,应用复杂的计算公式,并将应用程序中的表格保存为各种格式等]【源于百度百科】,从介绍上面看,好像Office Excel能处理的,她都能处理嘛,不过可惜的是她不是开源的这鬼要Money,道听途说的,没有Licence的Asponse.Cell导出的Excel有水印,这里我没有去证实,当然网上有非官方手段的dll。

public static void OutFileToDisk(DataTable dt,string tableName,string path)
{
Workbook workbook = new Workbook();
//工作簿
Worksheet sheet = workbook.Worksheets[0];
//工作表
Cells cells = sheet.Cells;
//单元格
//为标题设置样式
Style styleTitle = workbook.Styles[workbook.Styles.Add()];
//新增样式
styleTitle.HorizontalAlignment = TextAlignmentType.Center;
//文字居中
styleTitle.Font.Name = "宋体";
//文字字体
styleTitle.Font.Size = 18;
//文字大小
styleTitle.Font.IsBold = true;
//粗体
//样式2
Style style2 = workbook.Styles[workbook.Styles.Add()];
//新增样式
style2.HorizontalAlignment = TextAlignmentType.Center;
//文字居中
style2.Font.Name = "宋体";
//文字字体
style2.Font.Size = 14;
//文字大小
style2.Font.IsBold = true;
//粗体
style2.IsTextWrapped = true;
//单元格内容自动换行
style2.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
style2.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
style2.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
style2.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
//样式3
Style style3 = workbook.Styles[workbook.Styles.Add()];
//新增样式
style3.HorizontalAlignment = TextAlignmentType.Center;
//文字居中
style3.Font.Name = "宋体";
//文字字体
style3.Font.Size = 12;
//文字大小
style3.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
style3.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
style3.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
style3.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
int Colnum = dt.Columns.Count;
//表格列数
int Rownum=dt.Rows.Count;
//表格行数
//生成行1 标题行
cells.Merge(0, 0, 1, Colnum);
//合并单元格
cells[0, 0].PutValue(tableName);
//填写内容
cells[0, 0].SetStyle(styleTitle);
cells.SetRowHeight(0, 38);
//生成行2 列名行
for (int i = 0; i < Colnum; i++)
{
cells[1, i].PutValue(dt.Columns[i].ColumnName);
cells[1, i].SetStyle(style2); cells.SetRowHeight(1, 25);
}
//生成数据行
for (int i = 0; i < Rownum; i++)
{
for (int k = 0; k < Colnum; k++)
{
cells[2 + i, k].PutValue(dt.Rows[i][k].ToString());
cells[2 + i, k].SetStyle(style3);
}
cells.SetRowHeight(2+i, 24);
} workbook.Save(path);
}
public MemoryStream OutFileToStream(DataTable dt, string tableName)
{
Workbook workbook = new Workbook();
//工作簿
Worksheet sheet = workbook.Worksheets[0];
//工作表
Cells cells = sheet.Cells;
//单元格
//为标题设置样式
Style styleTitle = workbook.Styles[workbook.Styles.Add()];
//新增样式
styleTitle.HorizontalAlignment = TextAlignmentType.Center;
//文字居中
styleTitle.Font.Name = "宋体";
//文字字体
styleTitle.Font.Size = 18;
//文字大小
styleTitle.Font.IsBold = true;
//粗体
//样式2
Style style2 = workbook.Styles[workbook.Styles.Add()];
//新增样式
style2.HorizontalAlignment = TextAlignmentType.Center;
//文字居中
style2.Font.Name = "宋体";
//文字字体
style2.Font.Size = 14;
//文字大小
style2.Font.IsBold = true;
//粗体
style2.IsTextWrapped = true;
//单元格内容自动换行
style2.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
style2.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
style2.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
style2.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
//样式3
Style style3 = workbook.Styles[workbook.Styles.Add()];
//新增样式
style3.HorizontalAlignment = TextAlignmentType.Center;
//文字居中
style3.Font.Name = "宋体";
//文字字体
style3.Font.Size = 12;
//文字大小
style3.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
style3.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
style3.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
style3.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
int Colnum = dt.Columns.Count;
//表格列数
int Rownum = dt.Rows.Count;
//表格行数
//生成行1 标题行
cells.Merge(0, 0, 1, Colnum);
//合并单元格
cells[0, 0].PutValue(tableName);
//填写内容
cells[0, 0].SetStyle(styleTitle);
cells.SetRowHeight(0, 38);
//生成行2 列名行
for (int i = 0; i < Colnum; i++)
{
cells[1, i].PutValue(dt.Columns[i].ColumnName);
cells[1, i].SetStyle(style2);
cells.SetRowHeight(1, 25);
}
//生成数据行
for (int i = 0; i < Rownum; i++)
{
for (int k = 0; k < Colnum; k++)
{
cells[2 + i, k].PutValue(dt.Rows[i][k].ToString());
cells[2 + i, k].SetStyle(style3);
}
cells.SetRowHeight(2 + i, 24);
}
MemoryStream ms = workbook.SaveToStream(); return ms;
}
public static bool ExportExcelWithAspose(System.Data.DataTable dt, string path)
{
bool succeed = false;
if (dt != null)
{
try
{
Aspose.Cells.License li = new Aspose.Cells.License();
string lic = "";
Stream s = new MemoryStream(ASCIIEncoding.Default.GetBytes(lic));
li.SetLicense(s);
Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook();
Aspose.Cells.Worksheet cellSheet = workbook.Worksheets[0];
cellSheet.Name = dt.TableName;
int rowIndex = 0;
int colIndex = 0;
int colCount = dt.Columns.Count;
int rowCount = dt.Rows.Count;
//列名的处理
for (int i = 0; i < colCount; i++)
{
cellSheet.Cells[rowIndex, colIndex].PutValue(dt.Columns[i].ColumnName);
cellSheet.Cells[rowIndex, colIndex].Style.Font.IsBold = true;
cellSheet.Cells[rowIndex, colIndex].Style.Font.Name = "宋体";
colIndex++;
}
Aspose.Cells.Style style = workbook.Styles[workbook.Styles.Add()];
style.Font.Name = "Arial";
style.Font.Size = 10;
Aspose.Cells.StyleFlag styleFlag = new Aspose.Cells.StyleFlag();
cellSheet.Cells.ApplyStyle(style, styleFlag);
rowIndex++;
for (int i = 0; i < rowCount; i++)
{
colIndex = 0; for (int j = 0; j < colCount; j++)
{
cellSheet.Cells[rowIndex, colIndex].PutValue(dt.Rows[i][j].ToString());
colIndex++;
}
rowIndex++;
}
cellSheet.AutoFitColumns();
path = Path.GetFullPath(path);
workbook.Save(path);
succeed = true;
}
catch (Exception ex)
{
succeed = false;
}
}
return succeed;
}

  

4、采用OleDb

OLEDB是采用数据库连接方式进行读取数据,也就是采用我们SQL语句进行读写操作,她读取的数据或者插入的数据是没有格式的(Office2003除外,在Office2003如果模版表格有格式,那么插入的数据格式会于表头保持一致)。采用数据库方式进行连接读取那么肯定需要数据库驱动,和其他数据库一样,需要一个Access的一个数据驱动器,没有这个也是肯定玩不转的,就像你要用Aspose.Cells没有这个dll肯定是用不了的。采用数据库读取,方便快捷。

Office2003采用连接方式为:Provider=Microsoft.Jet.OLEDB.4.0 ; Data Source =filePath;Extended Properties=Excel 8.0

Office2007+版本连接方式:Provider=Microsoft.Ace.OleDb.12.0;data source=filePath;Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'

public class OledbProcessExcel
{
private const string XLS = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0";
private const string XLSX = "Provider=Microsoft.Ace.OleDb.12.0;data source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
private string m_Connstr;
public OledbProcessExcel(string filePath)
{
FileInfo info = new FileInfo(filePath);
if(info.Extension.ToLower() == ".xls")
{
m_Connstr = string.Format(XLS,filePath);
}
else
{
m_Connstr = string.Format(XLSX,filePath);
}
} public int ExecuteNonQuery(string cmdText, IDbDataParameter[] param)
{
using (OleDbConnection conn = new OleDbConnection(m_Connstr))
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = cmdText;
cmd.Parameters.AddRange(param);
return cmd.ExecuteNonQuery();
}
}
} public object ExecuteScalar(string cmdText, IDbDataParameter[] param)
{
using (OleDbConnection conn = new OleDbConnection(m_Connstr))
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = cmdText;
cmd.Parameters.AddRange(param);
return cmd.ExecuteScalar();
}
}
} public DataTable ExecuteForDataTable(string cmdText, IDbDataParameter[] param)
{
using (OleDbConnection conn = new OleDbConnection(m_Connstr))
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = cmdText;
cmd.Parameters.AddRange(param);
DataTable dt = new DataTable();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
{
adapter.Fill(dt);
return dt;
}
}
}
}
}

  

5、Excel2CSV

其实这种方式主要在于对一次性需要将数据读取出来,做的一个保护,类似我司中就Excel大于5M的Excel就会转为CSV采用IO读取的方式进行,我们都知道采用数据库方式连接吐出DataTable方式操作是方便的,但是DataTable是一个复杂的数据结构,在数据量较大的情况容易内存溢出,我司的数据基本都是W为单位的,所以做了一个简单的转换处理,而转换也是采用的另一个程序进行转换的,主要还是防止内存溢出。

6、总结

博客在于生活工作中的点点滴滴的记录,不是每个人的剧本都一样。同样,上述的功能或者实现不是每个人都适用,我这里仅仅是一个抛砖引玉的一个作用,如果某位同学发现内容有误,或者侵犯版权,请及时联系我,核实后我及时更正。如有转载麻烦请写明出处,最后采用一句经典话语收尾“生活是如此的精彩,生命是如此的辉煌”。

【狼窝乀野狼】Excel那些事儿的更多相关文章

  1. 【狼窝乀野狼】Serializer妙手回春

    在我们很多程序中,需要将数据保存到本地,以便于下次打开还能看到原始数据.例如我们Xmind思维导图,例如我们的Power Designer等等,都是有保存一个隶属于自己的工程文件,那么今天我要说的就是 ...

  2. 【狼窝乀野狼】Parallel浅尝辄止

    前段时间看到园子里面有同学在用Parallel进行批量插入数据库.后面也有很多同学针对这一事件给出了自己的看法和见解.我在这里不评论内容的好坏,至少能将自己东西总结分享这个是要靠勇气和毅力. 闲话少说 ...

  3. 【狼窝乀野狼】Windows Server 2008 R 配置 Microsoft Server 2008 远程登录连接

    如果你已经了解了,或者你已经经历了,那么此篇文章对你是毫无用处.因为文笔深处未必有自己亲身体验来的真实有效. 闲话少说,直接上菜. 最近脑子“抽筋”,想安装一个服务器来玩玩,那么怎么选择呢?我的PC是 ...

  4. .net实现与excel的数据交互、导入导出

    应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨. 本人之前从事PHP的开发工作,熟悉PHP的都应该 ...

  5. SharePoint 2013 Excel Services ECMAScript 示例之明日限行

    前言:最近遇到一个“明日限行”的功能,北京的交通啊,这个不在今天讨论范围内,暂不吐槽,想想代码开发,还要写WebPart部署,很麻烦,而且部署服务器,需要领导审批,想绕过这个麻烦事儿,就想到客户端了, ...

  6. 工作中最常用的Excel函数公式大全

    电脑那些事儿2016-05-18 22:23:02微软 公式 工作阅读(22574)评论(1) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 Wo ...

  7. 【转载】FPGA功耗的那些事儿

    在项目设计初期,基于硬件电源模块的设计考虑,对FPGA设计中的功耗估计是必不可少的. 笔者经历过一个项目,整个系统的功耗达到了100w,而单片FPGA的功耗估计得到为20w左右, 有点过高了,功耗过高 ...

  8. C# API: 生成和读取Excel文件

    我们想为用户提供一些数据,考虑再三, 大家认为对于用户(人,而非机器)的可读性, Excel文件要好一些. 因为相比csv,xml等文件, Excel中我们可以运用自动筛选, 窗口锁定, 还可以控制背 ...

  9. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

随机推荐

  1. hdu 1530 最大团模板

    说明摘自:pushing my way 的博文 最大团 通过该博主的代码,总算理解了最大团问题,但是他实现时的代码效率却不算太高.因此在最后献上我的模板.加了IO优化目前的排名是: 6 yejinru ...

  2. java识别验证码

    所需资源下载链接(资源免费,重在分享) Tesseract:http://download.csdn.net/detail/chenyangqi/9190667 jai_imageio-1.1-alp ...

  3. MySQL选择数据库use与mysql_select_db使用详解

      在mysql中如果我们在命令模式下选择与切换数据库直接使用use即可,在php中选择数据使用mysql_select_db即可,下面我来介绍一下.     从命令提示符,选择MySQL数据库: 这 ...

  4. jQuery AJAX Call for posting data to ASP.Net page ( not Get but POST)

    the following jQuery AJAX call to an ASP.Net page. $.ajax({ async: true, type: "POST", url ...

  5. JavaScript学习笔记 - 进阶篇(2)- 数组

    什么是数组 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会变的更麻烦.我们用数组 ...

  6. 如何自学java迅速成为java高手

    要想学好Java,首先要知道Java的大致分类.我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ...

  7. css z-index属性

    原文地址:http://www.neoease.com/css-z-index-property-and-layering-tree/ CSS 中的 z-index 属性用于设置节点的堆叠顺序, 拥有 ...

  8. 全面解析SQL SERVER 的左右内连接

    SQL SERVER数据库的三种常用连接解析: 这里先给出一个官方的解释: left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右 ...

  9. 而在Jquery中则使用$.map()、$.each()来操作数组

    首先是普通的数组(索引为整数的数组): //$.map(arr,fn); //对数组中的每个元素调用fn函数逐个进行处理,fn函数将处理返回最后得到的一个新的数组 var arr = [9, 8, 7 ...

  10. 推荐一些C#相关的网站、资源和书籍

    一.网站 1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.m ...