在工作中我们常常遇到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、总结

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

转载于:https://www.cnblogs.com/VisualAssistX/p/6082598.html

【狼窝乀野狼】Excel那些事儿相关推荐

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

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

  2. mysql sql语句联系_sql语句练习50题(Mysql版)

    表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...

  3. excel操作技巧:聊聊关于打印的一些事儿

    在之前的学习中,小编给小伙伴们带来了许多关于Excel操作的小技巧,不过最近很多小伙伴在打印上又犯了难题,倒在了最后一步上,实在是亏得很.今天小编就来给大家讲讲打印的那些难事儿! 难题一: 多列数据打 ...

  4. C#后台创建Excel文件的那点事儿

    使用C#在应用中生成excel文档,甚至再提供直接下载功能,算是一个比较常用的应用,这里记录下自己遇到的几种方法,还有一些需要注意的地方: a) 首先定义一个数据类: 代码 publicclassDa ...

  5. 还在被Excel报表折磨?学会这个进阶工具,报表开发不是事儿

    最近奥运会期间,作为一名报表开发者,竟然连男单乒乓夺冠这么精彩的画面都没空看, 因为- 人家下班我做表,人家睡觉我做表,人家看比赛我做表,一年到头都在跟Excel做斗争!!! 其实造成这种原因的关键, ...

  6. C# 解析Excel中的那些事儿

    [前言] 由于总部的系统做的不错,公司准备在下面的各个企业推系统:在所有的企业中上海是最强的,公司决定先将上海这个市场拿下:因此我们有了一次感受江南之城的机会,我们组开发人员全员出动配合需求人员利用一 ...

  7. Excel:日期计算那些事儿

    1.四舍五入函数Round() 语法: ROUND(A,B) A:需要进行四舍五入的数字. B:指定的位数,按此位数进行四舍五入. 说明: 如果 B>0,则四舍五入到指定的小数位. 如果 B=0 ...

  8. 计算机excel计算If怎么算,Excel函数公式:关于SUMIF函数的那些事儿,全在此篇

    条件求和是Excel中应用非常广泛的,常用函数为SUMIF,可以对数据源范围内符合指定条件的值求和. 一.SUMIF函数主要功能及语法结构. 功能:去指定条件下对应范围内的和. 语法结构: SUMIF ...

  9. Excel工作表保护公式那些事儿

    [要求]保护工作表C1:C4中的公式,防止被修改. 一.纯手工操作 1.选择整个工作表--自定义单元格格式--保护--取消勾选锁定 2.选中有公式的单元格--自定义单元格格式--勾选锁定和隐藏 3.审 ...

最新文章

  1. Latex使用简单总结
  2. ComplexHeatmap()函数解析
  3. Linux目录规范和含义(转)
  4. python面向对象(1) —— 封装
  5. linux usb键盘驱动详解
  6. android app resign之后安装提示INSTALL_PARSE_FAILED_NO_CERTIFICATES的解决办法
  7. Java多线程编程—锁优化
  8. cin cout加快
  9. 为什么要制定一些自己根本不想执行的计划?
  10. django基础 第一章 环境搭建
  11. 网易2017笔试 编程题目
  12. 2016/11/23【转载3】USB OTG 引脚定义
  13. c语言编程吉他和弦,学吉他和弦怎么弹啊?就C大调C,Dm,Em,F,G,Am,Bdim.1,2,3,4,5,6,7级和弦举个简单的例帮帮我...
  14. word自动编号+二级标题随一级标题变化
  15. 商业仲裁与诉讼律师Katherine Cheung加入德汇香港担任合伙人
  16. 炼数成金(dataguru)IT技能修炼
  17. 初级算法题->有效的数独--弄清哈希表的本质
  18. Linux:更新 /usr/share/glib-2.0/schemas 目录
  19. __new__方法,单例模式的小应用
  20. 苹果设置显示连接到服务器,iPhone升级更新至iOS9后显示连接到iCloud服务器错误现象的解决办法...

热门文章

  1. C语言知识点总结:指针
  2. ESP8266 下载模式 GPIO 研究
  3. 爸爸的信:学会鄙视自己,才不会妥协
  4. 技术集锦 | 大数据云原生技术实战及最佳实践系列
  5. Word排版之段落样式+如何创建一个三线表外观的表格样式
  6. 程序人生 | 从导游转行测试工程师:人总在期盼一个改变自己的机会
  7. 《一个人的朝圣》读书摘记
  8. python读音有道-Python 20行简单实现有道在线翻译的详解
  9. LNMP旧版本一键安装
  10. ERROR: flag ‘flagfile‘ was defined more than once