在工作中我们常常遇到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. CF 335B - Palindrome 区间DP

    335B - Palindrome 题目: 给出一个字符串(均有小写字母组成),如果有长度为100的回文子串,输出该子串.否则输出最长的回文子串. 分析: 虽然输入串的长度比较长,但是如果存在单个字母 ...

  2. Apps Vol53

    Android 內購破解 Freedom 軟件 iOS破解軟件IAPFree 能偽造UID   IAPFree : 系統已經JB Cydia加入作者的軟件源 Cydia.crazydoraemon.c ...

  3. 判断checked是否选中

    if($('#checkbox-id').is(':checked')) {     // do something }

  4. js完美解决IE6不支持position:fixed的bug

    详细内容请点击 <!DOCTYPE html><html><head><meta http-equiv="Content-Type" co ...

  5. 理解C#系列 / 核心C# / 变量

    变量 变量? 变量是对一个东西指定一个名称,变量的功能和人的名字差不多,提到名字就知道指的是什么. 变量类型? 变量类型说明了变量的类型,声明变量是一个整数,还是小数,还是字符,或是图像,或是人类,或 ...

  6. 推荐最近使用的一个APP

    最近使用一个APP叫做得到,觉得很不错,将一些很好的思想提炼出来,然后语音表达,放松眼睛,聆听收获.

  7. python基础:三层循环

    三层循环基本演示: break_flag = False #标记1 break_flag2 = False #标记2 break_flag3 = False #标记3 while not break_ ...

  8. (转)手把手教你如何架设VPN

    简介 让远程用户连接Exchange Server的传统解决方案是使用Outlook Web Access.然而,为何不使用虚拟专用网(Virtual Private Network,VPN)让你的远 ...

  9. [javascript|基本概念|Underfined]学习笔记

    Underfined类型的值:underfined(只有一个) 1/声明未初始化 e.g.:var msg;-->msg == underfined:true 2/申明并值初始化为underfi ...

  10. 7 款令人赞叹的 HTML5 动画应用

    1.HTML5 3D图片阴影翻转动画 这是一款很酷的HTML5 3D动画特效,这款3D特效可以为你的图片增加阴影的效果,而且可以让图片在鼠标滑过的时候出现3D翻转的动画效果. 在线演示 源码下载 2. ...