将datatable导出为excel的三种方式(转)

一、使用Microsoft.Office.Interop.Excel.DLL

  需要安装Office

  代码如下: 

 

复制代码
2 publicstaticboolExportExcel(System.Data.DataTable dt, stringpath)
3 {
4 boolsucceed =false;
5 if(dt !=null)
6 {
7 Microsoft.Office.Interop.Excel.Application xlApp =null;
8 try
9 {
10 xlApp =newMicrosoft.Office.Interop.Excel.ApplicationClass();
11 }
12 catch(Exception ex)
13 {
14 throwex;
15 }
16 
17 if(xlApp !=null)
18 {
19 try
20 {
21 Microsoft.Office.Interop.Excel.Workbook xlBook =xlApp.Workbooks.Add(true);
22 objectoMissing =System.Reflection.Missing.Value;
23 Microsoft.Office.Interop.Excel.Worksheet xlSheet =null;
24 
25 xlSheet =(Worksheet)xlBook.Worksheets[1];
26 xlSheet.Name =dt.TableName;
27 
28 introwIndex =1;
29 intcolIndex =1;
30 intcolCount =dt.Columns.Count;
31 introwCount =dt.Rows.Count;
32 
33 //列名的处理
34 for(inti =0; i <colCount; i++)
35 {
36 xlSheet.Cells[rowIndex, colIndex] =dt.Columns[i].ColumnName;
37 colIndex++;
38 }
39 //列名加粗显示
40 xlSheet.get_Range(xlSheet.Cells[rowIndex, 1], xlSheet.Cells[rowIndex, colCount]).Font.Bold =true;
41 xlSheet.get_Range(xlSheet.Cells[rowIndex, 1], xlSheet.Cells[rowCount +1, colCount]).Font.Name ="Arial";
42 xlSheet.get_Range(xlSheet.Cells[rowIndex, 1], xlSheet.Cells[rowCount +1, colCount]).Font.Size ="10";
43 rowIndex++;
44 
45 for(inti =0; i <rowCount; i++)
46 {
47 colIndex =1;
48 for(intj =0; j <colCount; j++)
49 {
50 xlSheet.Cells[rowIndex, colIndex] =dt.Rows[i][j].ToString();
51 colIndex++;
52 }
53 rowIndex++;
54 }
55 xlSheet.Cells.EntireColumn.AutoFit();
56 
57 xlApp.DisplayAlerts =false;
58 path =Path.GetFullPath(path);
59 xlBook.SaveCopyAs(path);
60 xlBook.Close(false, null, null);
61 xlApp.Workbooks.Close();
62 Marshal.ReleaseComObject(xlSheet);
63 Marshal.ReleaseComObject(xlBook);
64 xlBook =null;
65 succeed =true;
66 }
67 catch(Exception ex)
68 {
69 succeed =false;
70 }
71 finally
72 {
73 xlApp.Quit();
74 Marshal.ReleaseComObject(xlApp);
75 intgeneration =System.GC.GetGeneration(xlApp);
76 xlApp =null;
77 System.GC.Collect(generation);
78 }
79 }
80 }
81 returnsucceed;
82 }
复制代码

二、使用Aspose.Cells.dll

Aspose.Cells 是 Aspose公司推出的导出Excel的控件,不依赖Office,商业软件,网上有破解 (下载见附件)。

代码如下: 

复制代码
1 public static bool ExportExcelWithAspose(System.Data.DataTable dt, string path)
2 {
3 boolsucceed =false;
4 if(dt !=null)
5 {
6 try
7 {
8 Aspose.Cells.License li =newAspose.Cells.License();
9 stringlic =Resources.License;
10 Stream s =newMemoryStream(ASCIIEncoding.Default.GetBytes(lic));
11 li.SetLicense(s);
12 
13 Aspose.Cells.Workbook workbook =newAspose.Cells.Workbook();
14 Aspose.Cells.Worksheet cellSheet =workbook.Worksheets[0];
15 
16 cellSheet.Name =dt.TableName;
17 
18 introwIndex =0;
19 intcolIndex =0;
20 intcolCount =dt.Columns.Count;
21 introwCount =dt.Rows.Count;
22 
23 //列名的处理
24 for(inti =0; i <colCount; i++)
25 {
26 cellSheet.Cells[rowIndex, colIndex].PutValue(dt.Columns[i].ColumnName);
27 cellSheet.Cells[rowIndex, colIndex].Style.Font.IsBold =true;
28 cellSheet.Cells[rowIndex, colIndex].Style.Font.Name ="宋体";
29 colIndex++;
30 }
31 
32 Aspose.Cells.Style style =workbook.Styles[workbook.Styles.Add()];
33 style.Font.Name ="Arial";
34 style.Font.Size =10;
35 Aspose.Cells.StyleFlag styleFlag =newAspose.Cells.StyleFlag();
36 cellSheet.Cells.ApplyStyle(style, styleFlag);
37 
38 rowIndex++;
39 
40 for(inti =0; i <rowCount; i++)
41 {
42 colIndex =0;
43 for(intj =0; j <colCount; j++)
44 {
45 cellSheet.Cells[rowIndex, colIndex].PutValue(dt.Rows[i][j].ToString());
46 colIndex++;
47 }
48 rowIndex++;
49 }
50 cellSheet.AutoFitColumns();
51 
52 path =Path.GetFullPath(path);
53 workbook.Save(path);
54 succeed =true;
55 }
56 catch(Exception ex)
57 {
58 succeed =false;
59 }
60 }
61 
62 returnsucceed;
63 }
复制代码

 

三、 使用XML导出Excel

不依赖Office和其他第三方控件,需要事先准备一个模版。新建一个Excel文档,另存为XML 表格格式,将另存为的文件的扩展名改为xls,作为导出的模版。导出Excel时,用XMLDocment先打开模版,然后对模版进行增加修改操作,操作方法就是一般的XML操作方法。因为导出的文件扩展名是xls,与XML的文件格式不符,所以用Excel打开时会弹出提示。

代码如下:

复制代码
1 public static bool ExportExcelWithXML(System.Data.DataTable dt, string path)
2 {
3 boolsucceed =false;
4 if(dt ==null)
5 {
6 //导出为XML格式的Excel文件,需要事先准备好XML格式的Excel文件作为模版
7 try
8 {
9 XmlDocument doc =newXmlDocument();
10 doc.Load(System.Windows.Forms.Application.StartupPath +@"\XLS\ExportXML.xls");
11 XmlNode root =doc.DocumentElement;
12 XmlNodeList xnlist =root.ChildNodes;
13 XmlElement sheet =null;
14 XmlElement documentPro =null;
15 XmlElement styles =null;
16 foreach(XmlNode xn inxnlist)
17 {
18 XmlElement xe =(XmlElement)xn;
19 if(xe.Name =="DocumentProperties")
20 {
21 documentPro =xe;
22 }
23 elseif(xe.Name =="Worksheet")
24 {
25 sheet =xe;
26 }
27 elseif(xe.Name =="Styles")
28 {
29 styles =xe;
30 }
31 }
32 
33 if(documentPro ==null||sheet ==null||styles ==null)
34 {
35 returnfalse;
36 }
37 
38 //写入Sheet名
39 sheet.SetAttribute("Name", ssNameSpace, dt.TableName);
40 
41 //添加Style
42 XmlElement styleColumnName =doc.CreateElement("Style", ssNameSpace);
43 styleColumnName.SetAttribute("ID", ssNameSpace, "s16");
44 XmlElement fontColumnName =doc.CreateElement("Font", ssNameSpace);
45 fontColumnName.SetAttribute("FontName", ssNameSpace, "Arial");
46 fontColumnName.SetAttribute("Family", xNameSpace, "Swiss");
47 fontColumnName.SetAttribute("Color", ssNameSpace, "#000000");
48 fontColumnName.SetAttribute("Bold", ssNameSpace, "1");
49 styleColumnName.AppendChild(fontColumnName);
50 styles.AppendChild(styleColumnName);
51 
52 XmlElement styleRow =doc.CreateElement("Style", ssNameSpace);
53 styleRow.SetAttribute("ID", ssNameSpace, "s17");
54 XmlElement fontRow =doc.CreateElement("Font", ssNameSpace);
55 fontRow.SetAttribute("FontName", ssNameSpace, "Arial");
56 fontRow.SetAttribute("Family", xNameSpace, "Swiss");
57 fontRow.SetAttribute("Color", ssNameSpace, "#000000");
58 styleRow.AppendChild(fontRow);
59 styles.AppendChild(styleRow);
60 
61 //写入表格内容
62 XmlNode table =sheet.FirstChild;
63 
64 //写入行列个数
65 ((XmlElement)table).SetAttribute("ExpandedColumnCount", ssNameSpace, dt.Columns.Count.ToString());
66 ((XmlElement)table).SetAttribute("ExpandedRowCount", ssNameSpace, (dt.Rows.Count +2).ToString());
67 
68 //添加列宽
69 for(inti =0; i <dt.Columns.Count; i++)
70 {
71 XmlElement column =doc.CreateElement("Column", ssNameSpace);
72 column.SetAttribute("Width", ssNameSpace, "100");
73 column.SetAttribute("AutoFitWidth", ssNameSpace, "1");
74 table.AppendChild(column);
75 }
76 
77 //添加列名
78 XmlElement columnName =doc.CreateElement("Row", ssNameSpace);
79 for(inti =0; i <dt.Columns.Count; i++)
80 {
81 XmlElement columnCell =doc.CreateElement("Cell", ssNameSpace);
82 columnCell.SetAttribute("StyleID", ssNameSpace, "s16");
83 
84 XmlElement data =doc.CreateElement("ss:Data", ssNameSpace);
85 data.SetAttribute("Type", ssNameSpace, "String");
86 data.InnerText =dt.Columns[i].ToString();
87 
88 columnCell.AppendChild(data);
89 columnName.AppendChild(columnCell);
90 }
91 table.AppendChild(columnName);
92 
93 //添加行
94 for(inti =0; i <dt.Rows.Count; i++)
95 {
96 XmlElement row =doc.CreateElement("Row", ssNameSpace);
97 for(intj =0; j <dt.Columns.Count; j++)
98 {
99 XmlElement cell =doc.CreateElement("Cell", ssNameSpace);
100 cell.SetAttribute("StyleID", ssNameSpace, "s17");
101 
102 XmlElement data =doc.CreateElement("Data", ssNameSpace);
103 data.SetAttribute("Type", ssNameSpace, "String");
104 data.InnerText =dt.Rows[i][j].ToString();
105 
106 cell.AppendChild(data);
107 row.AppendChild(cell);
108 }
109 table.AppendChild(row);
110 }
111 
112 DateTime now =DateTime.Now;
113 stringtimeString =string.Format("{0}T{1}Z", now.ToShortDateString(), now.ToLongTimeString());
114 XmlNodeList docProNodeList =documentPro.ChildNodes;
115 foreach(XmlNode xn indocProNodeList)
116 {
117 if(xn.Name =="Author"||xn.Name =="LastAuthor")
118 {
119 //写入作者和修改者
120 xn.InnerText =Environment.UserName;
121 }
122 elseif(xn.Name =="Created"||xn.Name =="LastSaved")
123 {
124 //写入创建时间和修改时间
125 xn.InnerText =timeString;
126 }
127 elseif(xn.Name =="Company")
128 {
129 //写入公司名
130 xn.InnerText =System.Windows.Forms.Application.CompanyName;
131 }
132 }
133 
134 doc.Save(path);
135 succeed =true;
136 }
137 catch(Exception e)
138 {
139 succeed =false;
140 }
141 }
142 
143 returnsucceed;
144 }

转载于:https://www.cnblogs.com/zpc870921/p/3286664.html

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

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

相关文章

java锁的实现方式_Java 集群锁如何实现呢?

针对分布式锁的实现&#xff0c;目前比较常用的有以下几种方案&#xff1a;基于数据库实现分布式锁 基于缓存(redis&#xff0c;memcached&#xff0c;tair)实现分布式锁 基于Zookeeper实现分布式锁基于数据库表要实现分布式锁&#xff0c;最简单的方式可能就是直接创建一张锁表…

java判断字符集_Java 常用工具类---- 各种字符集编码判断与转换

import java.io.UnsupportedEncodingException;/*** 判断字符编码** author guyinyihun*/public class CharacterCodingUtil {private final static String ENCODE "GBK";/*** 判断是否为ISO-8859-1** return*/public static boolean checkISO(String str) {boolean…

只安装和配置instantclient,用plsql developer,navicat for oracle,sqlplus连接oracle数据库 ....

环境配置&#xff1a; 1.到oracle官网下载instantclient basic包&#xff0c;解压缩到E:\oracle\instantclient_11_2&#xff1b; 2.设置环境变量 NLS_lANGSIMPLIFIED CHINESE_CHINA.ZHS16GBK&#xff08;注意中间有空格&#xff0c;这个如果不设&#xff0c;toad查询中文会是乱…

bae java上传图片_干货分享:gradle+svn轻松搞定BAE java代码上传

背景在BAE基础版和专业版上&#xff0c;java应用通过war包文件部署的时候&#xff0c;总会遇到一些小麻烦&#xff1a;BAE专业版的svn/git有单文件40M的限制&#xff0c;所以在专业版的svn/git中上传超过40M的war包(很多war包都会超过40M)是不可行的BAE基础版的svn/git&#xf…

java缺省包详解_Java在其它包中无法引用缺省包中的类

1、现象1.1 问题场景最近&#xff0c;在写测试代码时&#xff0c;将一个类(这里暂且称为ClassA)放在在缺省包中&#xff0c;也就是说&#xff0c;直接放在了src目录下&#xff0c;没有创建包。然后&#xff0c;将这个类打入了jar文件&#xff0c;提供给另外的工程(这里称为Proj…

myeclipse开发代码颜色搭配保护视力

废话不多说&#xff0c;这个东西主要是为了保护视力的&#xff0c;另外我也挺喜欢上边的颜色搭配的&#xff0c;今天特拿出来分享。直接上图 转载于:https://www.cnblogs.com/suncoolcat/p/3293895.html

linux下qt5静态编译器_笔记-linux下Qt5.3.2 静态编译

这里主要讲linux下的编译&#xff0c;windows下面比较简单依赖sudo apt-get install"^libxcb.*"libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev编译选项configure -confirm-license -opensource -static -release -no-qml-debug -qt-freetype -qt-xcb -n…

css--block formatting context

block formatting context(块级格式化上下文) 如何产生BFC&#xff1a;当一个HTML元素满足下面条件的任何一点&#xff0c;都可以产生Block Formatting Context&#xff1a; float的值不为none。overflow的值不为visible。display的值为table-cell, table-caption, inline-bloc…

java自定义注解_Java自定义注解

Java 注解(Annotation)又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同&#xff0c;Java 标注可以通过反射获取标注内容。在编译器生成类文件时&#xff0c;标注可以被嵌入到字节码中。Java 虚…

ios内购二次认证服务器代码

<?php// 获取认证结果的状态值 function get_status($arr) {while(list($key, $value) each($arr)) {if ($key "status") {return $value;}}return 10000; }// 认证 function verify($check_data, $is_sandbox 0) {$url "https://buy.itunes.apple.com/…

Java字符串压缩存储_java字符串压缩 - jeff1989的个人页面 - OSCHINA - 中文开源技术交流社区...

最近在做电信的一个用户套餐使用积量查询的接口&#xff0c;查询出的结构是一大段字符串。为了减小网络传输&#xff0c;故将字符串采用jdk自带的gzip和zip方法进行压缩。并用apache common 的base64进行压缩字符串的转码。base64的转码需要导入apache的codec包&#xff0c;不要…

android内存及内存溢出分析

一、 Android的内存机制 Android的程序由Java语言编写&#xff0c;所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存&#xff0c;所有对象在java堆内分配空间&#xff1b;然而对象的释放是由垃圾回收器来完成的。C&#xff0f;C中的内存机制是“谁污染…

java 通用方法_java 通用方法 代码

Class.forName("com.mysql.jdbc.Driver");String url"jdbc:mysql://localhost/bbs?userroot& passwordroot";Connection connDriverManager.getConnection(url);conn.setAutoCommit(false);String sql"insert into article values(null,?,?,no…

【原】UIView实现点击着重效果的解决方案

我们知道&#xff0c;在IOS中UIButton UIControl都有一个默认的选中效果&#xff0c;即点中后会图标会变暗&#xff0c;移开后又恢复正常。如何让UIView UIImageView等这些普通的view也实现同样的效果呢&#xff1f; 最近的一个项目里面&#xff0c;需要实现一个类似iPad/iPhon…

java oom产生原因_什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?

该OutOfMemoryError异常被抛出JVM&#xff0c;当JVM没有足够的可用内存&#xff0c;来分配。OutOfMemoryError在Exception类层次结构中属于Error类别。产生OutOfMemoryError我们将分配大量内存&#xff0c;这将耗尽堆内存的存储空间。我们将继续分配内存并达到目标&#xff0c;…

jquery在选择器中使用变量及innerText问题(转载)

转自&#xff1a;http://blog.csdn.net/shineall/article/details/7275449 最近在研究一个投票的小程序&#xff0c;写到获取每个作品的投票按钮及显示票数div的id时&#xff0c;遇到了点问题。 其中gid是一个变量&#xff0c;作为作品的唯一标识。 用dom动态更新当前票数写法如…

vs2010快捷键大全

CtrlE,D ----格式化全部代码 CtrlE,F ----格式化选中的代码 CTRL SHIFT B生成解决方案 CTRL F7生成编译 CTRL O打开文件 CTRL SHIFT O打开项目 CTRL SHIFT C显示类视图窗口 F4显示属性窗口 SHIFT F4显示项目属性窗口 CTRL SHIFT E显示资源视图 F12转到定义 CTRL F1…

猜字小游戏java方法体_java实现猜字小游戏

闲来无事&#xff0c;实现一个猜数字的小游戏&#xff0c;目的是巩固自己的基础知识&#xff0c;培养敲代码的乐趣。首先在项目中所创建的类中导包(视频教程推荐&#xff1a;java课程)import java.util.Scanner;//一个简单的文本扫描器&#xff0c;可以使用正则表达式解析原始类…

java 某天为当年第几周_JAVA 日期 一个时间段总共几周,每一天星期几

/*** 查询一个时间段的总周数和查询当前时间是第几周*paramstart*paramend*return*/private int[] selectWeekNum(Date start,Date end,int week,intflag){java.util.Calendar nowjava.util.Calendar.getInstance();java.util.Calendar c_totaljava.util.Calendar.getInstance(…