一、使用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的三种方式(转)的更多相关文章

  1. c# 导出excel的三种方式

    第一种:流导出 SaveFileDialog exe = new SaveFileDialog(); exe.Filter = "Execl files (*.xls)|*.xls" ...

  2. POI导出excel的三种方式

    原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...

  3. 导出excel的三种方式

    第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的时候会有提示,而且不好控制内容.第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的 ...

  4. C# - VS2019 DataGridView导出到Excel的三种方法

    //原文出处:http://www.yongfa365.com/Item/DataGridViewToExcel.html 1 #region DataGridView数据显示到Excel /// & ...

  5. C#读取Excel的三种方式以及比较

    (1)OleDB方式 优点:将Excel直接当做数据源处理,通过SQL直接读取内容,读取速度较快. 缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet页读取出来后(结果为Dat ...

  6. .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)

    .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构)   public cl ...

  7. C#将DataTable数据导出到EXCEL的两种方法

    1.在非服务器控件的页面导出数据,需要借助一张temp空页面post回后台的数据. 前台:window.location.href = "../Temp.aspx"; 后台: tr ...

  8. [转].net 使用NPOI或MyXls把DataTable导出到Excel

    本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...

  9. delphi 导出到excel的7种方法

    本文来自 爱好者8888 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kpc2000/article/details/17066823?utm_source=cop ...

随机推荐

  1. 【Linux】- ls命令详解

    1 命令功能: 列出当前目录下或者指定目录下的所有文件和目录,ls是list的缩写. 2 命令语法: ls [选项] [目录名]     #注:[]中的内容为非必选项 3 命令选项: -a 列出目录下 ...

  2. 【题解】[USACO12JAN]视频游戏的连击Video Game Combos

    好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...

  3. [CF107D]Crime Management

    题目大意:有一种长度为$n(n\leqslant 10^{18})$的字符串,给定$m(m\leqslant10^3)$种限制,即字符$c$出现的次数为$cnt$,若一个字符有多种限制,则满足任意一个 ...

  4. [luoguP3644] [APIO2015]八邻旁之桥(权值线段树)

    传送门 首先如果起点终点都在同一侧可以直接处理,如果需要过桥答案再加1 对于k等于1的情况 桥的坐标为x的话,a和b为起点和终点坐标 $ans=\sum_{1}^{n} abs(a_{i}-x)+ab ...

  5. 【ZJ选讲·钻石游戏】

    N×M的棋盘(M,N<=500)中,每个格子有一个颜色(颜色数1~9) P次操作(P<=1000),每次给出两个相邻的位置(保证颜色不同,两个格子有一条公共边),把这两个格子交换. 定 ...

  6. win32 application怎么把结果输出到调试窗口

    方法1: TCHAR str[]; wsprintf(str, TEXT(); OutputDebugString(TEXT("-------lala------\n")); Ou ...

  7. 强大的JQuery数组封装使用

    JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...

  8. [8.16模拟赛] 玩具 (dp/字符串)

    题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...

  9. 移动端浏览器touch事件的研究总结

    $("body").on("touchstart", function(e) {     e.preventDefault();     startX = e. ...

  10. 使用vue做移动app时,调用摄像头扫描二维码

    现在前端技术发展飞快,前端都能做app了,那么项目中,也会遇到调用安卓手机基层的一些功能,比如调用摄像头,完成扫描二维码功能 下面我就为大家讲解一下,我在项目中调用这功能的过程. 首先我们需要一个中间 ...