最近项目里面有个周报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

简单的Excel导出(两种方式)相关推荐

  1. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  2. excel下载两种方式(axios和window.open)

    excel下载两种方式 1 第一种 调用window.openmethods:{getDown() {window.open(baseUrl+ "/report/data_excel?cur ...

  3. 导出excel的两种方式

    引言 导出excel就是将后台的数据在数据库中查找出来,然后再将数据存放进excel表格中,这种操作多用于一些统计表中,将table中的数据导出来,存放进excel表格中.(最近在将手机中的短信往电脑 ...

  4. java导出excel的两种方式

    博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...

  5. Qt导出数据到EXCEL的两种方式

    一.导出到csv格式,这种格式不用安装office QString DModel::exportDataToCSV(QString lx) {QString dtStr="d:/" ...

  6. 【Excel】Java 操作 Excel 的两种方式:POI、EasyExcel

    1. 了解 POI 和 EasyExcel Java 中,常见的用来操作 Excel 的方式有 2 种:POI.EasyExcel.主要用于:对 Excel 进行导入.导出. POI:Apache.一 ...

  7. Java操作Excel的两种方式(详细)

    目录 POI操作 03版excel操作 07版操作 公式操作 poi读操作 EasyExcel操作 写操作 读操作 POI操作 poi操作excel分为03版和07版,03版的excel是有长度限制的 ...

  8. 使用 EasyExcel 读取Excel(两种方式)

    转载:https://www.cnblogs.com/oukele/p/11443659.html 引入 jar 包 <dependency><groupId>com.alib ...

  9. 原生js更改html,原生js更改css样式的两种方式

    原生js更改css样式的两种方式 发布时间:2020-08-30 01:46:17 来源:脚本之家 阅读:148 作者:外婆的彭湖湾 下面我给大家介绍的是原生js更改CSS样式的两种方式: 1. 通过 ...

  10. plsql导出表结构到excel_plsql 将表结构导出到excel中的两种方式

    1.情景展示 如何将表结构导出到excel中(不是建表的SQL语句),如何实现? 2.方式一 新建一个SQL窗口,输入要导出结构的表,选中右键-->描述 右键-->导出-->CSV文 ...

最新文章

  1. oracle rownum分页 出现重复数据
  2. Ubuntu系统启动错误问题的解决
  3. python中比较重要的几个函数_Python 几个重要的内置函数 python中的内置函数和关键字需要背过吗...
  4. C如何将二维数组作为返回值
  5. 5G 之战让运营商备受冷落?! | 极客头条
  6. linux下LAMP环境的搭配
  7. syslog (cactiez)
  8. linux系统下的打印机驱动下载,用于UNIXLinux系统的打印机驱动程序-Lexmark.PDF
  9. PCB设计之EMC 47原则
  10. 多开分身苹果版_【苹果/安卓】影分身,我们每个人都会!
  11. 解决jest处理es模块
  12. SEO工作者面试基本都会被问到的问题
  13. 剑指offer(18) 二叉树的下一个结点
  14. [WinError 10060]错误
  15. 工智能是实现教育生态重构的有效手段,将改变教育的时空场景和供给水平
  16. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取
  17. matlab用多个cpu,Matlab 多核 多个CPU 并行运算
  18. 灰度处理与二值化的关系
  19. 【疑难解决】EasyCVR通过SDK接入海康NVR通道无法播放,该如何排查?
  20. S7-200SMART如何组态高速计数器及如何使当前值断电保持?

热门文章

  1. php8更新,PHP 8 中新特性以及重大调整
  2. STM32F1笔记(一)GPIO输出
  3. java url下载ics_使用Microsoft Graph API处理外部(Internet / .ics)日历URL
  4. 著名开源项目_著名开源项目案例研究
  5. observable_Java Observable addObserver()方法与示例
  6. 二元矩阵峰值搜索_好斗的牛(二元搜索)
  7. c#中重载单目运算符-_C#程序重载二进制运算符(-,*,/)
  8. Spring三种对象创建方式
  9. hadoop put命令的格式_HDFS常用命令
  10. 2016_shengyang_onsite