将datatable导出为excel的三种方式(转)
生活随笔
收集整理的這篇文章主要介紹了
将datatable导出为excel的三种方式(转)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、使用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,商業(yè)軟件,網(wǎng)上有破解?(下載見附件)。
代碼如下:?
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?//寫入表格內(nèi)容
62?XmlNode?table?=sheet.FirstChild;
63?
64?//寫入行列個數(shù)
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?//寫入創(chuàng)建時間和修改時間
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?}
轉(zhuǎn)載于:https://www.cnblogs.com/zpc870921/p/3286664.html
總結(jié)
以上是生活随笔為你收集整理的将datatable导出为excel的三种方式(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: strconv---用来基本类型之间的转
- 下一篇: JVM内存结构和Java内存模型别再傻傻