将datatable导出为excel的三种方式(转)
一、使用Microsoft.Office.Interop.Excel.DLL
需要安装Office
代码如下:
2 public static bool ExportExcel(System.Data.DataTable dt, string path)
3 {
4 bool succeed = false;
5 if (dt != null)
6 {
7 Microsoft.Office.Interop.Excel.Application xlApp = null;
8 try
9 {
10 xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
11 }
12 catch (Exception ex)
13 {
14 throw ex;
15 }
16
17 if (xlApp != null)
18 {
19 try
20 {
21 Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
22 object oMissing = 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 int rowIndex = 1;
29 int colIndex = 1;
30 int colCount = dt.Columns.Count;
31 int rowCount = dt.Rows.Count;
32
33 //列名的处理
34 for (int i = 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 (int i = 0; i < rowCount; i++)
46 {
47 colIndex = 1;
48 for (int j = 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 int generation = System.GC.GetGeneration(xlApp);
76 xlApp = null;
77 System.GC.Collect(generation);
78 }
79 }
80 }
81 return succeed;
82 }
二、使用Aspose.Cells.dll
Aspose.Cells 是 Aspose公司推出的导出Excel的控件,不依赖Office,商业软件,网上有破解 (下载见附件)。
代码如下:
1 public static bool ExportExcelWithAspose(System.Data.DataTable dt, string path)
2 {
3 bool succeed = false;
4 if (dt != null)
5 {
6 try
7 {
8 Aspose.Cells.License li = new Aspose.Cells.License();
9 string lic = Resources.License;
10 Stream s = new MemoryStream(ASCIIEncoding.Default.GetBytes(lic));
11 li.SetLicense(s);
12
13 Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook();
14 Aspose.Cells.Worksheet cellSheet = workbook.Worksheets[0];
15
16 cellSheet.Name = dt.TableName;
17
18 int rowIndex = 0;
19 int colIndex = 0;
20 int colCount = dt.Columns.Count;
21 int rowCount = dt.Rows.Count;
22
23 //列名的处理
24 for (int i = 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 = new Aspose.Cells.StyleFlag();
36 cellSheet.Cells.ApplyStyle(style, styleFlag);
37
38 rowIndex++;
39
40 for (int i = 0; i < rowCount; i++)
41 {
42 colIndex = 0;
43 for (int j = 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 return succeed;
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 bool succeed = false;
4 if (dt == null)
5 {
6 // 导出为XML格式的Excel文件,需要事先准备好XML格式的Excel文件作为模版
7 try
8 {
9 XmlDocument doc = new XmlDocument();
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 in xnlist)
17 {
18 XmlElement xe = (XmlElement)xn;
19 if (xe.Name == "DocumentProperties")
20 {
21 documentPro = xe;
22 }
23 else if (xe.Name == "Worksheet")
24 {
25 sheet = xe;
26 }
27 else if (xe.Name == "Styles")
28 {
29 styles = xe;
30 }
31 }
32
33 if (documentPro == null || sheet == null || styles == null)
34 {
35 return false;
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 (int i = 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 (int i = 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 (int i = 0; i < dt.Rows.Count; i++)
95 {
96 XmlElement row = doc.CreateElement("Row", ssNameSpace);
97 for (int j = 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 string timeString = string.Format("{0}T{1}Z", now.ToShortDateString(), now.ToLongTimeString());
114 XmlNodeList docProNodeList = documentPro.ChildNodes;
115 foreach (XmlNode xn in docProNodeList)
116 {
117 if (xn.Name == "Author" || xn.Name == "LastAuthor")
118 {
119 // 写入作者和修改者
120 xn.InnerText = Environment.UserName;
121 }
122 else if (xn.Name == "Created" || xn.Name == "LastSaved")
123 {
124 // 写入创建时间和修改时间
125 xn.InnerText = timeString;
126 }
127 else if (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 return succeed;
144 }
将datatable导出为excel的三种方式(转)的更多相关文章
- c# 导出excel的三种方式
第一种:流导出 SaveFileDialog exe = new SaveFileDialog(); exe.Filter = "Execl files (*.xls)|*.xls" ...
- POI导出excel的三种方式
原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...
- 导出excel的三种方式
第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的时候会有提示,而且不好控制内容.第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的 ...
- C# - VS2019 DataGridView导出到Excel的三种方法
//原文出处:http://www.yongfa365.com/Item/DataGridViewToExcel.html 1 #region DataGridView数据显示到Excel /// & ...
- C#读取Excel的三种方式以及比较
(1)OleDB方式 优点:将Excel直接当做数据源处理,通过SQL直接读取内容,读取速度较快. 缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet页读取出来后(结果为Dat ...
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- C#将DataTable数据导出到EXCEL的两种方法
1.在非服务器控件的页面导出数据,需要借助一张temp空页面post回后台的数据. 前台:window.location.href = "../Temp.aspx"; 后台: tr ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- delphi 导出到excel的7种方法
本文来自 爱好者8888 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kpc2000/article/details/17066823?utm_source=cop ...
随机推荐
- gdb查看内存中所有的信息
他们会把做内核的人当成无所不能的,认为你们对反编译啥的都应该会. 俗话说的好,人要活成别人想要的样子嘛: 看下如何停止进程,让大家看到内存中到底是啥样子; 简单的print globalA当然能输出来 ...
- DataBase -- Second Highest Salary
Question: Write a SQL query to get the second highest salary from the Employee table. +----+-------- ...
- Codeforces Round #383 (Div. 1) C(二分图)
一道很巧妙的二分图的题目 简单分析性质可知,一个合法序列一定是由12,21这样的子串构成的,所以相邻的每隔2个两两配对 然后BF和GF互相配对,思考一下,如果存在奇环,那么必定有一个BG有两个GF,或 ...
- CCmdUI
原文链接地址:http://blog.csdn.net/luicha/article/details/6771185 CCmdUI是一个只被使用于ON_UPDATECOMMAND_UI消息的响应函数中 ...
- 将一张表的主键(ID)重置为从1开始自增排列
如果你有一张表,你的主键是ID,然后由于测来测去的原因,你的ID不是从1开始连续的自增了. 终于有一天,使用这张表的某个系统要导入正式数据了,强迫症这时候就表现的明显了,浑身不自在, 这时候你就需要将 ...
- LwIP - raw/callback API、协议栈API(sequential API)、BSD API(或者说 SOCKET API)
1.使用raw/callback API编程,用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式. recv_udp, accept_function, sent_tc ...
- es6+最佳入门实践(13)
13.模块化 13.1.什么是模块化 模块化是一种处理复杂系统分解为更好的可管理模块的方式.通俗的讲就是把一个复杂的功能拆分成多个小功能,并且以一种良好的机制管理起来,这样就可以认为是模块化.就像作家 ...
- 转:Linux下使用Nginx搭建简单图片服务器
最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的,今天再这里简单讲一下Nginx实现上传图片以及图片服务器的大致理念. 如果是个人项目或者企业小项目,仅 ...
- 动态规划:LCIS
先给出状态转移方程: 定义状态 F[i][j]表示以a串的前i个整数与b串的前j个整数且以b[j]为结尾构成的LCIS的长度 状态转移方程: ①F[i][j] = F[i-][j] (a[i] != ...
- [BZOJ3033]太鼓达人|欧拉图
Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...