简单的Excel导出(两种方式)

  最近项目里面有个周报Excel导出的功能,为了解决这个问题,我显示调研Excel内核的方式实现了,但是被告知该方法有诸多弊端(1、服务器需要装相应版本的Excel;2、如果程序中途出错服务器会有很多Excel进程);最后用得aspose.cells第三方控件的方式完成。

一、Excel内核方式实现

  该方法首先需要添加引用Microsoft.Office.Interop.Excel;然后添加同名的using。具体数据插入的逻辑可以忽略,代码如下

View Code
  1  /// Excel导出
  2         /// </summary>
  3         /// <param name="tArys">数据源</param>
  4         /// <param name="templetFileName">模板地址</param>
  5         /// <param name="reportFileName">导出文件临时地址</param>
  6         public static void ExportWeeklyReport(object[] tArys, string templetFileName, string reportFileName)
  7         {
  8             //模板文件
  9             string TempletFileName = templetFileName;
 10             //导出文件
 11             string ReportFileName = reportFileName;
 12 
 13             string strTempletFile = Path.GetFileName(TempletFileName);
 14             //将模板文件复制到输出文件 
 15             FileInfo mode = new FileInfo(TempletFileName);
 16             mode.CopyTo(ReportFileName, true);
 17 
 18             //打开excel
 19             object missing = Missing.Value;
 20             Application app = null;
 21             Workbook wb = null;
 22             Worksheet ws = null;
 23             Range r = null;
 24             //
 25             app = new Microsoft.Office.Interop.Excel.Application();
 26             wb = app.Workbooks.Open(ReportFileName, false, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
 27             app.Visible = true;
 28 
 29             //得到WorkSheet对象
 30             ws = (Worksheet)wb.Worksheets.get_Item(2);//2代表第二个sheet
 31 
 32             ////添加或修改WorkSheet里的数据
 33 
 34             //定义一些需要计算的变量
 35             int stafforganizedTotal = 0;
 36             int staffonguardTotal = 0;
 37             int staffontripTotal = 0;
 38             int stafftemporaryTotal = 0;
 39             string requiredtime = string.Empty;
 40 
 41             ///把数据写到Excel//
 42             if (tArys != null)
 43             {
 44                 for (int tis = 0; tis < tArys.Length; tis++)
 45                 {
 46 
 47                     object[,] tAry = (object[,])tArys[tis];
 48                     for (int ti = 0; ti < tAry.GetLength(0); ti++)
 49                     {
 50                         string name = cls.toString(tAry[ti, 0]);
 51                         switch (name)
 52                         {
 53                             case "stafforganized":
 54                                 stafforganizedTotal += cls.getNum(cls.toString(tAry[ti, 1]));
 55                                 break;
 56                             case "staffonguard":
 57                                 staffonguardTotal += cls.getNum(cls.toString(tAry[ti, 1]));
 58                                 break;
 59                             case "staffontrip":
 60                                 staffontripTotal += cls.getNum(cls.toString(tAry[ti, 1]));
 61                                 break;
 62                             case "stafftemporary":
 63                                 stafftemporaryTotal += cls.getNum(cls.toString(tAry[ti, 1]));
 64                                 break;
 65                             case "requiredtime":
 66                                 requiredtime = cls.toString(tAry[ti, 1]);
 67                                 break;
 68                             case "content":
 69                                 ws.Cells[10 + tis, 5] = cls.toString(tAry[ti, 1]);
 70                                 break;
 71                             case "plan":
 72                                 ws.Cells[25 + tis, 5] = cls.toString(tAry[ti, 1]);
 73                                 break;
 74                             case "responsibleperson":
 75                                 ws.Cells[25 + tis, 12] = cls.toString(tAry[ti, 1]);
 76                                 break;
 77                             default:
 78                                 break;
 79                         }
 80 
 81                     }
 82 
 83                 }
 84                 ws.Cells[6, 6] = stafforganizedTotal;
 85                 ws.Cells[6, 8] = staffonguardTotal;
 86                 ws.Cells[6, 10] = staffontripTotal;
 87                 ws.Cells[6, 12] = stafftemporaryTotal;
 88                 ws.Cells[4, 11] = requiredtime;
 89             }
 90 
 91             
 92 
 93             //输出Excel文件并退出
 94             wb.Save();
 95             wb.Close(null, null, null);
 96             app.Workbooks.Close();
 97             app.Application.Quit();
 98             app.Quit();
 99 
100             System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
101             System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
102             System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
103 
104             ws = null;
105             wb = null;
106             app = null;
107 
108 
109         }

 

二、aspose.cell方式实现

  该方法需要第三方控件的支持,可以在csdn上直接搜索下载,也可以购买。官网上有很多例子,我这个只是最最基础的。具体代码如下。(记得加引用后加using)

View Code
 1  /// <summary>
 2         /// 生成Excel到指定目录
 3         /// </summary>
 4         /// <param name="tArys"></param>
 5         /// <param name="regulardatetext"></param>
 6         public static void ExportWeeklyReport(object[] tArys, string templetFileName, string reportFileName)
 7         {
 8 
 9 
10             /////参考Aspose.Cells官网的例子http://www.aspose.com/demos/.net-components/aspose.cells/csharp/quick-start/data/hello-world.aspx
11            
12             //打开excel
13 
14             Workbook wb = new Workbook(templetFileName);//打开对应地址的excel模板
15             Worksheet ws = wb.Worksheets[1];//第二个sheet,从0开始
16             Cells cells = ws.Cells;//获取对应的cells 的引用
17 
18             ////定义几个需要计算的变量           
19             int stafforganizedTotal = 0;
20             int staffonguardTotal = 0;
21             int staffontripTotal = 0;
22             int stafftemporaryTotal = 0;
23             string requiredtime = string.Empty;
24 
25             ///把数据写到Excel//
26             if (tArys != null)
27             {
28                 for (int tis = 0; tis < tArys.Length; tis++)
29                 {
30 
31                     object[,] tAry = (object[,])tArys[tis];
32                     for (int ti = 0; ti < tAry.GetLength(0); ti++)
33                     {
34                         string name = cls.toString(tAry[ti, 0]);
35                         switch (name)
36                         {
37                             case "stafforganized":
38                                 stafforganizedTotal += cls.getNum(cls.toString(tAry[ti, 1]));
39                                 break;
40                             case "staffonguard":
41                                 staffonguardTotal += cls.getNum(cls.toString(tAry[ti, 1]));
42                                 break;
43                             case "staffontrip":
44                                 staffontripTotal += cls.getNum(cls.toString(tAry[ti, 1]));
45                                 break;
46                             case "stafftemporary":
47                                 stafftemporaryTotal += cls.getNum(cls.toString(tAry[ti, 1]));
48                                 break;
49                             case "requiredtime":
50                                 requiredtime = cls.toString(tAry[ti, 1]);
51                                 break;
52                             case "content":
53                                 cells[9 + tis, 4].PutValue(cls.toString(tAry[ti, 1]), true);
54                                 break;
55                             case "plan":
56                                 cells[24 + tis, 4].PutValue(cls.toString(tAry[ti, 1]), true);
57                                 break;
58                             case "responsibleperson":
59                                 cells[24 + tis, 11].PutValue(cls.toString(tAry[ti, 1]), true);
60                                 break;
61                             default:
62                                 break;
63                         }
64 
65                     }
66 
67                 }
68                 cells[5, 5].PutValue(stafforganizedTotal);
69                 cells[5, 7].PutValue(staffonguardTotal);
70                 cells[5, 9].PutValue(staffontripTotal);
71                 cells[5, 11].PutValue(stafftemporaryTotal);
72                 cells[3, 10].PutValue(requiredtime);
73         
74             }
75 
76             
77 
78 
79             //保存到相应的路径
80             wb.Save(reportFileName);
81 
82 
83 
84         }

转载于:https://www.cnblogs.com/chuanzhifeng/archive/2012/11/13/2768102.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款开源的文件搜索神器,终于不用记 find 命令了

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 这是 HelloGitHub 推出的《讲解开源项目》系列&#xff0c;用一篇文章带你快速上…

C2审核模式(c2 audit mode)

C2审核模式&#xff08;c2 audit mode&#xff09;SQL Server C2 Audit 是为了满足美国国防部针对计算机的安全访问的安全评级要求而引入的。 SQL C2Audit 可以记录shutdown,restart,成功和失败的Login,成功或者失败访问数据库对象&#xff0c;所欲数据定义的执行&#xff0c;数…

开发者必读:2022年移动应用趋势洞察白皮书

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 华为开发者联盟与艾瑞咨询联合发布《2022年移动应用趋势洞察白皮书》&#xff0c;本…

Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)

我们到底能走多远系列&#xff08;15&#xff09; 扯淡&#xff1a;这些知识点来源是通过面试涉及到的&#xff0c;面的公司不多&#xff0c;知识点涉及也不多&#xff0c;我每次面试后都在备忘录里写下有用的东西&#xff0c;集合起来分享一下&#xff0c;因为是知识点&#x…

对比学习 ——simsiam 代码解析。

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 ​ 目录 1 &#xff1a; 事先准备 。 2 &#xff1a; 代码阅读。 2.1: 数据读取…

wiki常用语法

为什么80%的码农都做不了架构师&#xff1f;>>> 说明 输入 效果 作用在任何地方 斜体字 斜体字 斜体字 粗体字 粗体字 粗体字 粗体加斜体 粗体加斜体 粗体加斜体 下划线 &#xff08;推荐替代斜体&#xff09; <u>下划线</…

【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

注&#xff1a;本文是【ASP.NET Web API系列教程】的一部分&#xff0c;如果您是第一次看本博客文章&#xff0c;请先看前面的内容。 3.3 Calling a Web API From a WPF Application (C#) 3.3 通过WPF应用程序调用Web API(C#) 本文引自&#xff1a;http://www.asp.net/web-api/…

java开发过程中的命名规范

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在读项目的过程中&#xff0c;发现好多同事的代码并不是很规范&#xff0c;有的包名也按照了驼峰的写法&#xff0c;虽说这样不是不行&#xff0c;但个人认为开发过程中应该遵守这些规范&#xff0c;现整理规范如…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…

SVG 和 CSS3 实现一个超酷爱心 Like 按钮

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 在现代网页中&#xff0c;我们经常可以在一些文章、视频和图片页面上找到”Like”按…

redis简单学习3-redis常用命令总结

2019独角兽企业重金招聘Python工程师标准>>> 1.键值相关的命令 keys 返回满足给定pattern的所有key 表达式* 代表取出所有的key redis 127.0.0.1:6379> keys * 1) "myzset2" 2) "myzset3" 3) "mylist" 4) "myset2" 5)…

微软的创新还是败笔?Windows 8为苹果创造天赐良机

网络安全公司Avast近日公布的数据显示&#xff1a;Windows系统使用人数正在不断下降。这一结果对微软来说可谓噩梦&#xff0c;于此同时&#xff0c;苹果则不断加强市场占有率。又是什么导致了这样的结果&#xff1f;接下来就看看最主要的几点&#xff1a; 调查覆盖了13.5万Wi…

testbench常用任务之SPI slave输出数据

模仿了SPI master从SPI slave读取数据的MiSO数据状态 每8个clk后读取的数据加1 用的一些额外寄存器需要自己声明和初始化 //------------------------------------------------------------------------- //send serial data which is increase by 1 on MiSO line //----------…

Vue生产环境调试的方法

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 vue 生产环境默认是无法启用vue devtools的&#xff0c;如果生产应用出了问题&…

RavenDB:基于Windows/.NET平台的NoSQL数据库

众所周知&#xff0c;NoSQL运动旨在成为大数据时代传统关系数据库管理系统的替代品。如今Microsoft对开源的态度有所转变&#xff0c;RavenDB就是很好的例子。Microsoft对RavenDB&#xff08;NoSQL数据库&#xff09;的认可令很多人感到惊讶。RavenDB可以轻易的替代关系数据库管…

JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

一、为什么我们要用连接池技术&#xff1f; 前面的数据库连接的建立及关闭资源的方法有些缺陷。统舱传统数据库访问方式&#xff1a;一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性能严重受损。 解决方案&#xff1a;数据库连接池&#xff08…

重温51汇编指令(附实验)

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 重温51汇编指令&#xff08;附实验&#xff09; 写在前面&#xff1a; 在电子控制…

SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解

2019独角兽企业重金招聘Python工程师标准>>> 作者&#xff1a;shede333主页&#xff1a;http://my.oschina.net/shede333 && http://blog.sina.com.cn/u/1509658847版权声明&#xff1a;原创文章&#xff0c;版权声明&#xff1a;自由转载-非商用-非衍生-保…

升级nginx,查看已经安装的模块,并隐藏或者修改版本号

升级前&#xff0c;查看已经安装的版本以及模块[rootmail ~]# /opt/nginx/sbin/nginx -Vnginx version: nginx/0.5.34 built by gcc 3.4.6 20060404 (Red Hat 3.4.6-3)configure arguments: --prefix/opt/nginx --sbin-path/opt/nginx/sbin/nginx --conf-path/opt/nginx/conf/n…

SpringCloudAlibaba微服务docker容器打包和部署示例实战

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 概述 我们使用前面《SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码…