CarlosAg.ExcelXmlWriter实现.net下Excel导出功能(服务端不需要安装Excel程序)
2007-04-16 14:49
696 查看
我的免费电影网站一:http://www.foxwow.com
我的免费电影网站二:http://www.91free.org
CarlosAg.ExcelXmlWriter是一三方dll控件,可以到http://www.carlosag.net/Tools/ExcelXmlWriter/Default.aspx
下载。他使用起来非常简单。在C#中使用方法:
using
CarlosAg.ExcelXmlWriter;
class
TestApp {
static
void
Main(
string
[] args) {
Workbook book
=
new
Workbook();
Worksheet sheet
=
book.Worksheets.Add(
"
Sample
"
);
WorksheetRow row
=
sheet.Table.Rows.Add();
row.Cells.Add(
"
Hello World
"
);
book.Save(
@"
c: est.xls
"
);
}
}
这样就生成了一简单的Excel文件就生成在C盘了。它生成的是xml形式的Excel。
一个workbook就是一个在内存中的Excel文件。您只需要对workbook进行操作,即可按您想要的形式构建一内存中的Excel文件。调用workbook的save方法就可以在内存中的Excel文件写入硬盘或http下载流中去。Workbook中主要有Styles
集合用于添加Excel文档中的样式分格。Worksheets集合用于添加Excel文档的sheet对象。
CarlosAg.ExcelXmlWrite的具体用法请官方网站http://www.carlosag.net
或网络上查询。
在.net web应用程序开发过程,经常会遇到Excel的导出功能,过去一直用微软的office组件,配置起来麻烦,而且服务端需要安装Excel程序,对环境的改变也会影响功能的正常运行。还会经常出现一些莫名其妙的问题。有了CarlosAg.ExcelXmlWriter这些问题都不会出现了。不需要任何配置东西。由于大多数是对DataTable数据的导出功能。所以我把CarlosAg.ExcelXmlWriter进行了二次封装,对于Web程序中的Excel导出功能做到了完全简化。如果要导出一个DataTable对象dt的数据到Excel中,只需要传入dt即可。当然Excel的表头就是dt中的列名。也可以对dt的列名进行自定义甚至实现多表头导出功能。下面我们来详细研究:
封装工作需要三个类来完成:
ExcelBook,Excel
主处理类。
ExcelColumn
,
Excel
表头字段类用于处理自定义表头时使用。
ExcelColumnCollection
,
Excel
表头字段集合,用于添加
Excel
表头。
ExcelBook类:
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.IO;
using
System.Text;
using
System.Collections.Generic;
using
CarlosAg.ExcelXmlWriter;
namespace
ExcelExp
...
{
/**/
///
<summary>
///
ExcelBook 导出功能主类 的摘要说明
///
</summary>
public
class
ExcelBook
...
{
private
Workbook _book
=
new
Workbook();
private
DataTable _dataTable
=
null
;
private
string
_title
=
""
;
private
Page _page
=
null
;
private
List
<
ExcelColumnCollection
>
_columnNamesCollection
=
new
List
<
ExcelColumnCollection
>
();
private
SortedList
<
string
,
int
>
_maxLengthOfField
=
new
SortedList
<
string
,
int
>
();
private
bool
_isAutoFitWidth
=
true
;
private
string
_Author
=
""
;
private
string
_LastAuthor
=
""
;
private
string
_Company
=
""
;
private
string
_Version
=
"
11.6408
"
;
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="dt">
DataTable形式的数据源
</param>
///
<param name="title">
Excel显示标题
</param>
public
ExcelBook(DataTable dt,
string
title)
...
{
Page page
=
(Page)HttpContext.Current.Handler;
if
(dt
==
null
)
...
{
throw
new
Exception(
"
数据源为空
"
);
}
_dataTable
=
dt;
_title
=
title;
_page
=
page;
}
/**/
///
<summary>
///
以GridView的Head为标题
///
</summary>
///
<param name="row">
GridView表头行对象
</param>
public
void
SetColumnNameFromGridViewHeadRow(GridViewRow row)
...
{
ExcelColumnCollection excelcols
=
new
ExcelColumnCollection();
_columnNamesCollection.Add(excelcols);
foreach
(TableCell cell
in
row.Cells)
...
{
excelcols.Add(
new
ExcelColumn(cell.Text));
}
}
/**/
///
<summary>
///
初始化Excel Workbook
///
</summary>
///
<param name="book">
book
</param>
private
void
InitializeBook(Workbook book)
...
{
book.Properties.Author
=
Author;
book.Properties.LastAuthor
=
LastAuthor;
book.Properties.Created
=
DateTime.Now;
book.Properties.Company
=
Company;
book.Properties.Version
=
Version;
book.ExcelWorkbook.WindowHeight
=
13500
;
book.ExcelWorkbook.WindowWidth
=
17100
;
book.ExcelWorkbook.WindowTopX
=
360
;
book.ExcelWorkbook.WindowTopY
=
75
;
book.ExcelWorkbook.ProtectWindows
=
false
;
book.ExcelWorkbook.ProtectStructure
=
false
;
}
/**/
///
<summary>
///
设置样式
///
</summary>
///
<param name="styles">
样式集合
</param>
private
void
SetStyles(WorksheetStyleCollection styles)
...
{
//
-----------------------------------------------
//
Default
//
-----------------------------------------------
WorksheetStyle Default
=
styles.Add(
"
Default
"
);
Default.Name
=
"
Normal
"
;
Default.Font.FontName
=
"
宋体
"
;
Default.Font.Size
=
12
;
Default.Alignment.Vertical
=
StyleVerticalAlignment.Center;
//
-----------------------------------------------
//
TitleStyle
//
-----------------------------------------------
WorksheetStyle TitleStyle
=
styles.Add(
"
TitleStyle
"
);
TitleStyle.Font.Bold
=
true
;
TitleStyle.Font.FontName
=
"
黑体
"
;
TitleStyle.Font.Size
=
14
;
TitleStyle.Alignment.Horizontal
=
StyleHorizontalAlignment.Center;
TitleStyle.Alignment.Vertical
=
StyleVerticalAlignment.Center;
//
-----------------------------------------------
//
FieldStyle
//
-----------------------------------------------
WorksheetStyle FieldStyle
=
styles.Add(
"
FieldStyle
"
);
FieldStyle.Font.Bold
=
true
;
FieldStyle.Font.FontName
=
"
宋体
"
;
FieldStyle.Font.Size
=
12
;
FieldStyle.Alignment.Horizontal
=
StyleHorizontalAlignment.Center;
FieldStyle.Borders.Add(StylePosition.Bottom, LineStyleOption.Continuous,
1
);
FieldStyle.Borders.Add(StylePosition.Left, LineStyleOption.Continuous,
1
);
FieldStyle.Borders.Add(StylePosition.Right, LineStyleOption.Continuous,
1
);
FieldStyle.Borders.Add(StylePosition.Top, LineStyleOption.Continuous,
1
);
//
-----------------------------------------------
//
LastFieldStyle
//
-----------------------------------------------
WorksheetStyle LastFieldStyle
=
styles.Add(
"
LastFieldStyle
"
);
LastFieldStyle.Font.Bold
=
true
;
LastFieldStyle.Font.FontName
=
"
宋体
"
;
LastFieldStyle.Font.Size
=
12
;
LastFieldStyle.Borders.Add(StylePosition.Bottom, LineStyleOption.Continuous,
1
);
LastFieldStyle.Borders.Add(StylePosition.Left, LineStyleOption.Continuous,
1
);
LastFieldStyle.Borders.Add(StylePosition.Right, LineStyleOption.Continuous,
1
);
LastFieldStyle.Borders.Add(StylePosition.Top, LineStyleOption.Continuous,
1
);
//
-----------------------------------------------
//
DataStyle
//
-----------------------------------------------
WorksheetStyle DataStyle
=
styles.Add(
"
DataStyle
"
);
DataStyle.Borders.Add(StylePosition.Bottom, LineStyleOption.Continuous,
1
);
DataStyle.Borders.Add(StylePosition.Right, LineStyleOption.Continuous,
1
);
DataStyle.Borders.Add(StylePosition.Top, LineStyleOption.Continuous,
1
);
DataStyle.Borders.Add(StylePosition.Left, LineStyleOption.Continuous,
1
);
}
/**/
///
<summary>
///
设置Excel Sheet
///
</summary>
///
<param name="sheets">
sheets集合
</param>
private
void
SetSheels(WorksheetCollection sheets)
...
{
Worksheet sheet
=
sheets.Add(_title);
sheet.Table.DefaultRowHeight
=
14.25F
;
sheet.Table.DefaultColumnWidth
=
54F;
sheet.Table.FullColumns
=
1
;
sheet.Table.FullRows
=
1
;
//
-----------------------------------------------
WorksheetRow row
=
null
;
WorksheetCell cell
=
null
;
大标题
#region
大标题
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
row.Height
=
30
;
cell
=
row.Cells.Add();
cell.StyleID
=
"
TitleStyle
"
;
cell.Data.Type
=
DataType.String;
cell.Data.Text
=
_title;
cell.MergeAcross
=
_dataTable.Columns.Count
-
1
;
#endregion
foreach
(DataColumn dc
in
_dataTable.Columns)
//
初始化列宽度集合
...
{
_maxLengthOfField[dc.ColumnName]
=
0
;
}
//
-----------------------------------------------字段
字段标题行
#region
字段标题行
if
(_columnNamesCollection.Count
!=
0
)
...
{
for
(
int
i
=
0
; i
<
_columnNamesCollection.Count; i
++
)
...
{
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
int
j
=
0
;
foreach
(ExcelColumn ec
in
_columnNamesCollection[i])
...
{
cell
=
row.Cells.Add();
cell.Data.Text
=
ec.Name;
cell.Data.Type
=
DataType.String;
if
(i
!=
_columnNamesCollection.Count
-
1
)
...
{
cell.MergeAcross
=
ec.MergeAcross;
cell.StyleID
=
"
FieldStyle
"
;
}
else
//
最下层标题行
...
{
cell.StyleID
=
"
LastFieldStyle
"
;
_maxLengthOfField[_dataTable.Columns[j
++
].ColumnName]
=
GetMaxLength(_maxLengthOfField[_dataTable.Columns[j
++
].ColumnName], ec.Name);
}
}
}
}
else
...
{
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
foreach
(DataColumn dc
in
_dataTable.Columns)
...
{
cell
=
row.Cells.Add();
cell.Data.Text
=
dc.ColumnName;
cell.Data.Type
=
DataType.String;
cell.StyleID
=
"
FieldStyle
"
;
_maxLengthOfField[dc.ColumnName]
=
GetMaxLength(_maxLengthOfField[dc.ColumnName],dc.ColumnName);
}
}
#endregion
//
-----------------------------------------------
数据行
#region
数据行
object
dcValueO
=
null
;
string
dcValueS
=
null
;
foreach
(DataRow dr
in
_dataTable.Rows)
...
{
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
foreach
(DataColumn dc
in
_dataTable.Columns)
...
{
dcValueO
=
dr[dc];
if
(dcValueO
==
DBNull.Value)
dcValueS
=
string
.Empty;
else
dcValueS
=
dcValueO.ToString();
cell
=
row.Cells.Add();
cell.Data.Text
=
dcValueS;
cell.Data.Type
=
TypeConvert(dc.DataType);
cell.StyleID
=
"
DataStyle
"
;
if
(_isAutoFitWidth
||
_columnNamesCollection.Count
==
0
)
...
{
_maxLengthOfField[dc.ColumnName]
=
GetMaxLength(_maxLengthOfField[dc.ColumnName], dcValueS);
}
}
}
#endregion
//
-----------------------------------------------
设置列
#region
设置列
WorksheetColumn column
=
null
;
if
(
!
_isAutoFitWidth
&&
_columnNamesCollection.Count
!=
0
)
...
{
foreach
(ExcelColumn ec
in
_columnNamesCollection[_columnNamesCollection.Count
-
1
])
...
{
column
=
new
WorksheetColumn();
column.AutoFitWidth
=
false
;
column.Width
=
ec.Width;
sheet.Table.Columns.Add(column);
}
}
else
...
{
foreach
(DataColumn dc
in
_dataTable.Columns)
...
{
column
=
new
WorksheetColumn();
column.AutoFitWidth
=
false
;
column.Width
=
_maxLengthOfField[dc.ColumnName]
*
7
;
sheet.Table.Columns.Add(column);
}
}
#endregion
//
Options
//
-----------------------------------------------
sheet.Options.Selected
=
true
;
sheet.Options.ProtectObjects
=
false
;
sheet.Options.ProtectScenarios
=
false
;
sheet.Options.Print.PaperSizeIndex
=
9
;
sheet.Options.Print.HorizontalResolution
=
300
;
sheet.Options.Print.VerticalResolution
=
300
;
sheet.Options.Print.ValidPrinterInfo
=
true
;
}
/**/
///
<summary>
///
向客户端发送Excel下载文档数据
///
</summary>
///
<param name="downloadFileName">
下载时显示的文件名称
</param>
public
void
WriteExcelToClient(
string
downloadFileName)
...
{
string
fileName
=
string
.IsNullOrEmpty(downloadFileName)
?
(
string
.IsNullOrEmpty(_title)
?
"
未命名文件
"
: _title) : downloadFileName;
InitializeBook(_book);
SetStyles(_book.Styles);
SetSheels(_book.Worksheets);
_book.Save(_page.Response.OutputStream);
_page.Response.AppendHeader(
"
Content-Disposition
"
,
"
Attachment; FileName=
"
+
HttpUtility.UrlEncode(fileName, Encoding.UTF8)
+
"
.xls;
"
);
_page.Response.ContentEncoding
=
System.Text.Encoding.UTF8;
_page.Response.Charset
=
"
UTF-8
"
;
_page.Response.Flush();
_page.Response.End();
}
/**/
///
<summary>
///
向客户端发送Excel下载文档数据
///
</summary>
public
void
WriteExcelToClient()
...
{
WriteExcelToClient(
null
);
}
/**/
///
<summary>
///
数据类型转换
///
</summary>
///
<param name="type"></param>
///
<returns></returns>
private
DataType TypeConvert(Type type)
...
{
switch
(type.Name)
...
{
case
"
Decimal
"
:
case
"
Double
"
:
case
"
Single
"
:
return
DataType.Number;
case
"
Int16
"
:
case
"
Int32
"
:
case
"
Int64
"
:
case
"
SByte
"
:
case
"
UInt16
"
:
case
"
UInt32
"
:
case
"
UInt64
"
:
return
DataType.Number;
case
"
String
"
:
return
DataType.String;
case
"
DateTime
"
:
return
DataType.String;
default
:
return
DataType.String;
}
}
/**/
///
<summary>
///
添加标题行 集合
///
</summary>
///
<param name="exColumnCollection"></param>
public
void
AddColumnNamesCollection(ExcelColumnCollection exColumnCollection)
...
{
_columnNamesCollection.Add(exColumnCollection);
}
/**/
///
<summary>
///
清楚标题行集合
///
</summary>
public
void
ClearColumnNamesCollection()
...
{
_columnNamesCollection.Clear();
}
/**/
///
<summary>
///
列宽是否自适应
///
</summary>
public
bool
IsAutoFitWidth
...
{
get
...
{
return
_isAutoFitWidth; }
set
...
{ _isAutoFitWidth
=
value; }
}
public
string
Author
...
{
get
...
{
return
_Author; }
set
...
{ _Author
=
value; }
}
public
string
LastAuthor
...
{
get
...
{
return
_LastAuthor; }
set
...
{ _LastAuthor
=
value; }
}
public
string
Company
...
{
get
...
{
return
_Company; }
set
...
{ _Company
=
value; }
}
public
string
Version
...
{
get
...
{
return
_Version; }
set
...
{ _Version
=
value; }
}
/**/
///
<summary>
///
获取字段最大宽度函数
///
</summary>
///
<param name="oldLength">
原来长度
</param>
///
<param name="str">
当前字符串
</param>
///
<returns>
最大值
</returns>
private
int
GetMaxLength(
int
oldLength,
string
str)
...
{
if
(str
==
null
) str
=
""
;
byte
[] bs
=
System.Text.Encoding.Default.GetBytes(str.Trim());
int
newLength
=
bs.Length;
if
(oldLength
>
newLength)
return
oldLength;
else
return
newLength;
}
}
}
ExcelColumn Excel表头字段类
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
namespace
ExcelExp
...
{
/**/
///
<summary>
///
Excel列名ExcelColumn 的摘要说明
///
</summary>
public
class
ExcelColumn
...
{
private
int
_width
=
150
;
//
默认宽度
private
string
_name
=
string
.Empty;
//
列名
private
int
_mergeAcross
=
0
;
//
跨越字段
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="width">
列宽
</param>
///
<param name="name">
列名
</param>
public
ExcelColumn(
int
width,
string
name)
...
{
this
._width
=
width;
this
._name
=
name;
this
._mergeAcross
=
0
;
}
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="name">
列名
</param>
///
<param name="colspan">
合并列数
</param>
public
ExcelColumn(
string
name,
int
colspan)
...
{
this
._name
=
name;
this
._mergeAcross
=
colspan
-
1
;
}
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="name">
列名
</param>
public
ExcelColumn(
string
name)
...
{
this
._name
=
name;
}
public
int
Width
...
{
get
...
{
return
_width; }
}
public
string
Name
...
{
get
...
{
return
_name; }
}
public
int
MergeAcross
...
{
get
...
{
return
_mergeAcross; }
}
}
}
ExcelColumnCollection
,Excel
表头字段集合类
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
namespace
ExcelExp
...
{
/**/
///
<summary>
///
ExcelColumnCollection 的摘要说明
///
</summary>
public
class
ExcelColumnCollection : System.Collections.CollectionBase
...
{
public
ExcelColumnCollection()
...
{
}
/**/
///
<summary>
///
将对象添加到 ExcelColumnCollection 的结尾处。
///
</summary>
///
<param name="value">
要添加到 ExcelColumnCollection 的末尾处的
<see cref="ExcelColumn"/>
。
</param>
///
<returns>
ExcelColumnCollection 索引,已在此处添加了 value。
</returns>
public
int
Add(ExcelColumn value)
...
{
return
(List.Add(value));
}
/**/
///
<summary>
///
搜索指定的
<see cref="ExcelColumn"/>
,并返回整个 ExcelColumnCollection 中第一个匹配项的从零开始的索引。
///
</summary>
///
<param name="value">
要在 ExcelColumnCollection 中查找的
<see cref="ExcelColumn"/>
。
</param>
///
<returns>
如果在整个 ExcelColumnCollection 中找到 value 的第一个匹配项,则为该项的从零开始的索引;否则为 -1。
</returns>
public
int
IndexOf(ExcelColumn value)
...
{
return
(List.IndexOf(value));
}
/**/
///
<summary>
///
从 RoleCollection 中移除特定对象的第一个匹配项。
///
</summary>
///
<param name="value">
要从
<see cref="ExcelColumnCollection"/>
移除的
<see cref="ExcelColumn"/>
。
</param>
///
///
<exception cref="System.ArgumentException">
未在 ExcelColumnCollection 对象中找到 value 参数。
</exception>
///
<exception cref="System.NotSupportedException">
ExcelColumnCollection 为只读,或 ExcelColumnCollection 具有固定大小。
///
</exception>
public
void
Remove(ExcelColumn value)
...
{
List.Remove(value);
}
/**/
///
<summary>
///
获取或设置指定索引处的元素。
///
</summary>
///
<param name="index">
要获得或设置的元素从零开始的索引。
</param>
///
<returns>
指定索引处的元素。
</returns>
///
<exception cref="System.ArgumentOutOfRangeException">
index 小于零。
///
- 或 -
///
index 等于或大于 Count。
///
</exception>
public
ExcelColumn
this
[
int
index]
...
{
get
...
{
return
(ExcelColumn)List[index];
}
set
...
{
List[index]
=
value;
}
}
/**/
///
<summary>
///
获取或设置指定 关键字 的元素。
///
</summary>
///
<param name="nodeText">
要获得或设置的元素的关键字。
</param>
///
<returns>
如果在整个 ItemNodeCollection 中找到 关键字 的第一个匹配项,则为该项的元素;否则为 null。
</returns>
///
<exception cref="System.ArgumentException">
设置未成功,集合中未找到指定关键字的元素。
</exception>
public
ExcelColumn
this
[
string
name]
...
{
get
...
{
ExcelColumn excelColumn;
for
(
int
i
=
0
; i
<
List.Count; i
++
)
...
{
excelColumn
=
(ExcelColumn)List[i];
if
(excelColumn.Name
==
name)
...
{
return
excelColumn;
}
}
return
null
;
}
set
...
{
ExcelColumn excelColumn;
for
(
int
i
=
0
; i
<
List.Count; i
++
)
...
{
excelColumn
=
(ExcelColumn)List[i];
if
(excelColumn.Name
==
name)
...
{
excelColumn
=
value;
return
;
}
}
throw
new
ArgumentException(
"
设置未成功,集合中未找到指定关键字的元素。
"
);
}
}
}
}
使用方法:
直接导出DataTable dt的数据以dt的列名为表头名
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.Author
=
""
;
//
作者
eb.LastAuthor
=
""
;
//
最后作者
eb.Company
=
""
;
//
公司
eb.Version
=
""
;
//
版本
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
//
eb.WriteExcelToClient();
//
以标题为下载文件名
自定义表头名称
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
ExcelColumnCollection ec
=
new
ExcelColumnCollection();
eb.AddColumnNamesCollection(ec);
ec.Add(
new
ExcelColumn(
"
姓名
"
));
ec.Add(
new
ExcelColumn(
"
性别
"
));
ec.Add(
new
ExcelColumn(
"
学历
"
));
ec.Add(
new
ExcelColumn(
"
政治面貌
"
));
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
//
eb.WriteExcelToClient();
//
以标题为下载文件名
自定义多表头
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
ExcelColumnCollection ec
=
new
ExcelColumnCollection();
//
第一层表头
eb.AddColumnNamesCollection(ec);
ec.Add(
new
ExcelColumn(
"
基本信息
"
,
2
));
ec.Add(
new
ExcelColumn(
"
高级信息
"
,
2
));
ExcelColumnCollection ec2
=
new
ExcelColumnCollection();
//
第二层表头
eb.AddColumnNamesCollection(ec2);
ec2.Add(
new
ExcelColumn(
"
姓名
"
));
ec2.Add(
new
ExcelColumn(
"
性别
"
));
ec2.Add(
new
ExcelColumn(
"
学历
"
));
ec2.Add(
new
ExcelColumn(
"
政治面貌
"
));
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
以GridView的头为表
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
eb.SetColumnNameFromGridViewHeadRow(gridView1.HeaderRow);
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
有需要源代码或dll文件的请到我博客上下载:http://foxwoo.com/?p=46
我的免费电影网站二:http://www.91free.org
CarlosAg.ExcelXmlWriter是一三方dll控件,可以到http://www.carlosag.net/Tools/ExcelXmlWriter/Default.aspx
下载。他使用起来非常简单。在C#中使用方法:
using
CarlosAg.ExcelXmlWriter;
class
TestApp {
static
void
Main(
string
[] args) {
Workbook book
=
new
Workbook();
Worksheet sheet
=
book.Worksheets.Add(
"
Sample
"
);
WorksheetRow row
=
sheet.Table.Rows.Add();
row.Cells.Add(
"
Hello World
"
);
book.Save(
@"
c: est.xls
"
);
}
}
这样就生成了一简单的Excel文件就生成在C盘了。它生成的是xml形式的Excel。
一个workbook就是一个在内存中的Excel文件。您只需要对workbook进行操作,即可按您想要的形式构建一内存中的Excel文件。调用workbook的save方法就可以在内存中的Excel文件写入硬盘或http下载流中去。Workbook中主要有Styles
集合用于添加Excel文档中的样式分格。Worksheets集合用于添加Excel文档的sheet对象。
CarlosAg.ExcelXmlWrite的具体用法请官方网站http://www.carlosag.net
或网络上查询。
在.net web应用程序开发过程,经常会遇到Excel的导出功能,过去一直用微软的office组件,配置起来麻烦,而且服务端需要安装Excel程序,对环境的改变也会影响功能的正常运行。还会经常出现一些莫名其妙的问题。有了CarlosAg.ExcelXmlWriter这些问题都不会出现了。不需要任何配置东西。由于大多数是对DataTable数据的导出功能。所以我把CarlosAg.ExcelXmlWriter进行了二次封装,对于Web程序中的Excel导出功能做到了完全简化。如果要导出一个DataTable对象dt的数据到Excel中,只需要传入dt即可。当然Excel的表头就是dt中的列名。也可以对dt的列名进行自定义甚至实现多表头导出功能。下面我们来详细研究:
封装工作需要三个类来完成:
ExcelBook,Excel
主处理类。
ExcelColumn
,
Excel
表头字段类用于处理自定义表头时使用。
ExcelColumnCollection
,
Excel
表头字段集合,用于添加
Excel
表头。
ExcelBook类:
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.IO;
using
System.Text;
using
System.Collections.Generic;
using
CarlosAg.ExcelXmlWriter;
namespace
ExcelExp
...
{
/**/
///
<summary>
///
ExcelBook 导出功能主类 的摘要说明
///
</summary>
public
class
ExcelBook
...
{
private
Workbook _book
=
new
Workbook();
private
DataTable _dataTable
=
null
;
private
string
_title
=
""
;
private
Page _page
=
null
;
private
List
<
ExcelColumnCollection
>
_columnNamesCollection
=
new
List
<
ExcelColumnCollection
>
();
private
SortedList
<
string
,
int
>
_maxLengthOfField
=
new
SortedList
<
string
,
int
>
();
private
bool
_isAutoFitWidth
=
true
;
private
string
_Author
=
""
;
private
string
_LastAuthor
=
""
;
private
string
_Company
=
""
;
private
string
_Version
=
"
11.6408
"
;
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="dt">
DataTable形式的数据源
</param>
///
<param name="title">
Excel显示标题
</param>
public
ExcelBook(DataTable dt,
string
title)
...
{
Page page
=
(Page)HttpContext.Current.Handler;
if
(dt
==
null
)
...
{
throw
new
Exception(
"
数据源为空
"
);
}
_dataTable
=
dt;
_title
=
title;
_page
=
page;
}
/**/
///
<summary>
///
以GridView的Head为标题
///
</summary>
///
<param name="row">
GridView表头行对象
</param>
public
void
SetColumnNameFromGridViewHeadRow(GridViewRow row)
...
{
ExcelColumnCollection excelcols
=
new
ExcelColumnCollection();
_columnNamesCollection.Add(excelcols);
foreach
(TableCell cell
in
row.Cells)
...
{
excelcols.Add(
new
ExcelColumn(cell.Text));
}
}
/**/
///
<summary>
///
初始化Excel Workbook
///
</summary>
///
<param name="book">
book
</param>
private
void
InitializeBook(Workbook book)
...
{
book.Properties.Author
=
Author;
book.Properties.LastAuthor
=
LastAuthor;
book.Properties.Created
=
DateTime.Now;
book.Properties.Company
=
Company;
book.Properties.Version
=
Version;
book.ExcelWorkbook.WindowHeight
=
13500
;
book.ExcelWorkbook.WindowWidth
=
17100
;
book.ExcelWorkbook.WindowTopX
=
360
;
book.ExcelWorkbook.WindowTopY
=
75
;
book.ExcelWorkbook.ProtectWindows
=
false
;
book.ExcelWorkbook.ProtectStructure
=
false
;
}
/**/
///
<summary>
///
设置样式
///
</summary>
///
<param name="styles">
样式集合
</param>
private
void
SetStyles(WorksheetStyleCollection styles)
...
{
//
-----------------------------------------------
//
Default
//
-----------------------------------------------
WorksheetStyle Default
=
styles.Add(
"
Default
"
);
Default.Name
=
"
Normal
"
;
Default.Font.FontName
=
"
宋体
"
;
Default.Font.Size
=
12
;
Default.Alignment.Vertical
=
StyleVerticalAlignment.Center;
//
-----------------------------------------------
//
TitleStyle
//
-----------------------------------------------
WorksheetStyle TitleStyle
=
styles.Add(
"
TitleStyle
"
);
TitleStyle.Font.Bold
=
true
;
TitleStyle.Font.FontName
=
"
黑体
"
;
TitleStyle.Font.Size
=
14
;
TitleStyle.Alignment.Horizontal
=
StyleHorizontalAlignment.Center;
TitleStyle.Alignment.Vertical
=
StyleVerticalAlignment.Center;
//
-----------------------------------------------
//
FieldStyle
//
-----------------------------------------------
WorksheetStyle FieldStyle
=
styles.Add(
"
FieldStyle
"
);
FieldStyle.Font.Bold
=
true
;
FieldStyle.Font.FontName
=
"
宋体
"
;
FieldStyle.Font.Size
=
12
;
FieldStyle.Alignment.Horizontal
=
StyleHorizontalAlignment.Center;
FieldStyle.Borders.Add(StylePosition.Bottom, LineStyleOption.Continuous,
1
);
FieldStyle.Borders.Add(StylePosition.Left, LineStyleOption.Continuous,
1
);
FieldStyle.Borders.Add(StylePosition.Right, LineStyleOption.Continuous,
1
);
FieldStyle.Borders.Add(StylePosition.Top, LineStyleOption.Continuous,
1
);
//
-----------------------------------------------
//
LastFieldStyle
//
-----------------------------------------------
WorksheetStyle LastFieldStyle
=
styles.Add(
"
LastFieldStyle
"
);
LastFieldStyle.Font.Bold
=
true
;
LastFieldStyle.Font.FontName
=
"
宋体
"
;
LastFieldStyle.Font.Size
=
12
;
LastFieldStyle.Borders.Add(StylePosition.Bottom, LineStyleOption.Continuous,
1
);
LastFieldStyle.Borders.Add(StylePosition.Left, LineStyleOption.Continuous,
1
);
LastFieldStyle.Borders.Add(StylePosition.Right, LineStyleOption.Continuous,
1
);
LastFieldStyle.Borders.Add(StylePosition.Top, LineStyleOption.Continuous,
1
);
//
-----------------------------------------------
//
DataStyle
//
-----------------------------------------------
WorksheetStyle DataStyle
=
styles.Add(
"
DataStyle
"
);
DataStyle.Borders.Add(StylePosition.Bottom, LineStyleOption.Continuous,
1
);
DataStyle.Borders.Add(StylePosition.Right, LineStyleOption.Continuous,
1
);
DataStyle.Borders.Add(StylePosition.Top, LineStyleOption.Continuous,
1
);
DataStyle.Borders.Add(StylePosition.Left, LineStyleOption.Continuous,
1
);
}
/**/
///
<summary>
///
设置Excel Sheet
///
</summary>
///
<param name="sheets">
sheets集合
</param>
private
void
SetSheels(WorksheetCollection sheets)
...
{
Worksheet sheet
=
sheets.Add(_title);
sheet.Table.DefaultRowHeight
=
14.25F
;
sheet.Table.DefaultColumnWidth
=
54F;
sheet.Table.FullColumns
=
1
;
sheet.Table.FullRows
=
1
;
//
-----------------------------------------------
WorksheetRow row
=
null
;
WorksheetCell cell
=
null
;
大标题
#region
大标题
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
row.Height
=
30
;
cell
=
row.Cells.Add();
cell.StyleID
=
"
TitleStyle
"
;
cell.Data.Type
=
DataType.String;
cell.Data.Text
=
_title;
cell.MergeAcross
=
_dataTable.Columns.Count
-
1
;
#endregion
foreach
(DataColumn dc
in
_dataTable.Columns)
//
初始化列宽度集合
...
{
_maxLengthOfField[dc.ColumnName]
=
0
;
}
//
-----------------------------------------------字段
字段标题行
#region
字段标题行
if
(_columnNamesCollection.Count
!=
0
)
...
{
for
(
int
i
=
0
; i
<
_columnNamesCollection.Count; i
++
)
...
{
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
int
j
=
0
;
foreach
(ExcelColumn ec
in
_columnNamesCollection[i])
...
{
cell
=
row.Cells.Add();
cell.Data.Text
=
ec.Name;
cell.Data.Type
=
DataType.String;
if
(i
!=
_columnNamesCollection.Count
-
1
)
...
{
cell.MergeAcross
=
ec.MergeAcross;
cell.StyleID
=
"
FieldStyle
"
;
}
else
//
最下层标题行
...
{
cell.StyleID
=
"
LastFieldStyle
"
;
_maxLengthOfField[_dataTable.Columns[j
++
].ColumnName]
=
GetMaxLength(_maxLengthOfField[_dataTable.Columns[j
++
].ColumnName], ec.Name);
}
}
}
}
else
...
{
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
foreach
(DataColumn dc
in
_dataTable.Columns)
...
{
cell
=
row.Cells.Add();
cell.Data.Text
=
dc.ColumnName;
cell.Data.Type
=
DataType.String;
cell.StyleID
=
"
FieldStyle
"
;
_maxLengthOfField[dc.ColumnName]
=
GetMaxLength(_maxLengthOfField[dc.ColumnName],dc.ColumnName);
}
}
#endregion
//
-----------------------------------------------
数据行
#region
数据行
object
dcValueO
=
null
;
string
dcValueS
=
null
;
foreach
(DataRow dr
in
_dataTable.Rows)
...
{
row
=
sheet.Table.Rows.Add();
row.AutoFitHeight
=
true
;
foreach
(DataColumn dc
in
_dataTable.Columns)
...
{
dcValueO
=
dr[dc];
if
(dcValueO
==
DBNull.Value)
dcValueS
=
string
.Empty;
else
dcValueS
=
dcValueO.ToString();
cell
=
row.Cells.Add();
cell.Data.Text
=
dcValueS;
cell.Data.Type
=
TypeConvert(dc.DataType);
cell.StyleID
=
"
DataStyle
"
;
if
(_isAutoFitWidth
||
_columnNamesCollection.Count
==
0
)
...
{
_maxLengthOfField[dc.ColumnName]
=
GetMaxLength(_maxLengthOfField[dc.ColumnName], dcValueS);
}
}
}
#endregion
//
-----------------------------------------------
设置列
#region
设置列
WorksheetColumn column
=
null
;
if
(
!
_isAutoFitWidth
&&
_columnNamesCollection.Count
!=
0
)
...
{
foreach
(ExcelColumn ec
in
_columnNamesCollection[_columnNamesCollection.Count
-
1
])
...
{
column
=
new
WorksheetColumn();
column.AutoFitWidth
=
false
;
column.Width
=
ec.Width;
sheet.Table.Columns.Add(column);
}
}
else
...
{
foreach
(DataColumn dc
in
_dataTable.Columns)
...
{
column
=
new
WorksheetColumn();
column.AutoFitWidth
=
false
;
column.Width
=
_maxLengthOfField[dc.ColumnName]
*
7
;
sheet.Table.Columns.Add(column);
}
}
#endregion
//
Options
//
-----------------------------------------------
sheet.Options.Selected
=
true
;
sheet.Options.ProtectObjects
=
false
;
sheet.Options.ProtectScenarios
=
false
;
sheet.Options.Print.PaperSizeIndex
=
9
;
sheet.Options.Print.HorizontalResolution
=
300
;
sheet.Options.Print.VerticalResolution
=
300
;
sheet.Options.Print.ValidPrinterInfo
=
true
;
}
/**/
///
<summary>
///
向客户端发送Excel下载文档数据
///
</summary>
///
<param name="downloadFileName">
下载时显示的文件名称
</param>
public
void
WriteExcelToClient(
string
downloadFileName)
...
{
string
fileName
=
string
.IsNullOrEmpty(downloadFileName)
?
(
string
.IsNullOrEmpty(_title)
?
"
未命名文件
"
: _title) : downloadFileName;
InitializeBook(_book);
SetStyles(_book.Styles);
SetSheels(_book.Worksheets);
_book.Save(_page.Response.OutputStream);
_page.Response.AppendHeader(
"
Content-Disposition
"
,
"
Attachment; FileName=
"
+
HttpUtility.UrlEncode(fileName, Encoding.UTF8)
+
"
.xls;
"
);
_page.Response.ContentEncoding
=
System.Text.Encoding.UTF8;
_page.Response.Charset
=
"
UTF-8
"
;
_page.Response.Flush();
_page.Response.End();
}
/**/
///
<summary>
///
向客户端发送Excel下载文档数据
///
</summary>
public
void
WriteExcelToClient()
...
{
WriteExcelToClient(
null
);
}
/**/
///
<summary>
///
数据类型转换
///
</summary>
///
<param name="type"></param>
///
<returns></returns>
private
DataType TypeConvert(Type type)
...
{
switch
(type.Name)
...
{
case
"
Decimal
"
:
case
"
Double
"
:
case
"
Single
"
:
return
DataType.Number;
case
"
Int16
"
:
case
"
Int32
"
:
case
"
Int64
"
:
case
"
SByte
"
:
case
"
UInt16
"
:
case
"
UInt32
"
:
case
"
UInt64
"
:
return
DataType.Number;
case
"
String
"
:
return
DataType.String;
case
"
DateTime
"
:
return
DataType.String;
default
:
return
DataType.String;
}
}
/**/
///
<summary>
///
添加标题行 集合
///
</summary>
///
<param name="exColumnCollection"></param>
public
void
AddColumnNamesCollection(ExcelColumnCollection exColumnCollection)
...
{
_columnNamesCollection.Add(exColumnCollection);
}
/**/
///
<summary>
///
清楚标题行集合
///
</summary>
public
void
ClearColumnNamesCollection()
...
{
_columnNamesCollection.Clear();
}
/**/
///
<summary>
///
列宽是否自适应
///
</summary>
public
bool
IsAutoFitWidth
...
{
get
...
{
return
_isAutoFitWidth; }
set
...
{ _isAutoFitWidth
=
value; }
}
public
string
Author
...
{
get
...
{
return
_Author; }
set
...
{ _Author
=
value; }
}
public
string
LastAuthor
...
{
get
...
{
return
_LastAuthor; }
set
...
{ _LastAuthor
=
value; }
}
public
string
Company
...
{
get
...
{
return
_Company; }
set
...
{ _Company
=
value; }
}
public
string
Version
...
{
get
...
{
return
_Version; }
set
...
{ _Version
=
value; }
}
/**/
///
<summary>
///
获取字段最大宽度函数
///
</summary>
///
<param name="oldLength">
原来长度
</param>
///
<param name="str">
当前字符串
</param>
///
<returns>
最大值
</returns>
private
int
GetMaxLength(
int
oldLength,
string
str)
...
{
if
(str
==
null
) str
=
""
;
byte
[] bs
=
System.Text.Encoding.Default.GetBytes(str.Trim());
int
newLength
=
bs.Length;
if
(oldLength
>
newLength)
return
oldLength;
else
return
newLength;
}
}
}
ExcelColumn Excel表头字段类
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
namespace
ExcelExp
...
{
/**/
///
<summary>
///
Excel列名ExcelColumn 的摘要说明
///
</summary>
public
class
ExcelColumn
...
{
private
int
_width
=
150
;
//
默认宽度
private
string
_name
=
string
.Empty;
//
列名
private
int
_mergeAcross
=
0
;
//
跨越字段
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="width">
列宽
</param>
///
<param name="name">
列名
</param>
public
ExcelColumn(
int
width,
string
name)
...
{
this
._width
=
width;
this
._name
=
name;
this
._mergeAcross
=
0
;
}
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="name">
列名
</param>
///
<param name="colspan">
合并列数
</param>
public
ExcelColumn(
string
name,
int
colspan)
...
{
this
._name
=
name;
this
._mergeAcross
=
colspan
-
1
;
}
/**/
///
<summary>
///
构造函数
///
</summary>
///
<param name="name">
列名
</param>
public
ExcelColumn(
string
name)
...
{
this
._name
=
name;
}
public
int
Width
...
{
get
...
{
return
_width; }
}
public
string
Name
...
{
get
...
{
return
_name; }
}
public
int
MergeAcross
...
{
get
...
{
return
_mergeAcross; }
}
}
}
ExcelColumnCollection
,Excel
表头字段集合类
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
namespace
ExcelExp
...
{
/**/
///
<summary>
///
ExcelColumnCollection 的摘要说明
///
</summary>
public
class
ExcelColumnCollection : System.Collections.CollectionBase
...
{
public
ExcelColumnCollection()
...
{
}
/**/
///
<summary>
///
将对象添加到 ExcelColumnCollection 的结尾处。
///
</summary>
///
<param name="value">
要添加到 ExcelColumnCollection 的末尾处的
<see cref="ExcelColumn"/>
。
</param>
///
<returns>
ExcelColumnCollection 索引,已在此处添加了 value。
</returns>
public
int
Add(ExcelColumn value)
...
{
return
(List.Add(value));
}
/**/
///
<summary>
///
搜索指定的
<see cref="ExcelColumn"/>
,并返回整个 ExcelColumnCollection 中第一个匹配项的从零开始的索引。
///
</summary>
///
<param name="value">
要在 ExcelColumnCollection 中查找的
<see cref="ExcelColumn"/>
。
</param>
///
<returns>
如果在整个 ExcelColumnCollection 中找到 value 的第一个匹配项,则为该项的从零开始的索引;否则为 -1。
</returns>
public
int
IndexOf(ExcelColumn value)
...
{
return
(List.IndexOf(value));
}
/**/
///
<summary>
///
从 RoleCollection 中移除特定对象的第一个匹配项。
///
</summary>
///
<param name="value">
要从
<see cref="ExcelColumnCollection"/>
移除的
<see cref="ExcelColumn"/>
。
</param>
///
///
<exception cref="System.ArgumentException">
未在 ExcelColumnCollection 对象中找到 value 参数。
</exception>
///
<exception cref="System.NotSupportedException">
ExcelColumnCollection 为只读,或 ExcelColumnCollection 具有固定大小。
///
</exception>
public
void
Remove(ExcelColumn value)
...
{
List.Remove(value);
}
/**/
///
<summary>
///
获取或设置指定索引处的元素。
///
</summary>
///
<param name="index">
要获得或设置的元素从零开始的索引。
</param>
///
<returns>
指定索引处的元素。
</returns>
///
<exception cref="System.ArgumentOutOfRangeException">
index 小于零。
///
- 或 -
///
index 等于或大于 Count。
///
</exception>
public
ExcelColumn
this
[
int
index]
...
{
get
...
{
return
(ExcelColumn)List[index];
}
set
...
{
List[index]
=
value;
}
}
/**/
///
<summary>
///
获取或设置指定 关键字 的元素。
///
</summary>
///
<param name="nodeText">
要获得或设置的元素的关键字。
</param>
///
<returns>
如果在整个 ItemNodeCollection 中找到 关键字 的第一个匹配项,则为该项的元素;否则为 null。
</returns>
///
<exception cref="System.ArgumentException">
设置未成功,集合中未找到指定关键字的元素。
</exception>
public
ExcelColumn
this
[
string
name]
...
{
get
...
{
ExcelColumn excelColumn;
for
(
int
i
=
0
; i
<
List.Count; i
++
)
...
{
excelColumn
=
(ExcelColumn)List[i];
if
(excelColumn.Name
==
name)
...
{
return
excelColumn;
}
}
return
null
;
}
set
...
{
ExcelColumn excelColumn;
for
(
int
i
=
0
; i
<
List.Count; i
++
)
...
{
excelColumn
=
(ExcelColumn)List[i];
if
(excelColumn.Name
==
name)
...
{
excelColumn
=
value;
return
;
}
}
throw
new
ArgumentException(
"
设置未成功,集合中未找到指定关键字的元素。
"
);
}
}
}
}
使用方法:
直接导出DataTable dt的数据以dt的列名为表头名
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.Author
=
""
;
//
作者
eb.LastAuthor
=
""
;
//
最后作者
eb.Company
=
""
;
//
公司
eb.Version
=
""
;
//
版本
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
//
eb.WriteExcelToClient();
//
以标题为下载文件名
自定义表头名称
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
ExcelColumnCollection ec
=
new
ExcelColumnCollection();
eb.AddColumnNamesCollection(ec);
ec.Add(
new
ExcelColumn(
"
姓名
"
));
ec.Add(
new
ExcelColumn(
"
性别
"
));
ec.Add(
new
ExcelColumn(
"
学历
"
));
ec.Add(
new
ExcelColumn(
"
政治面貌
"
));
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
//
eb.WriteExcelToClient();
//
以标题为下载文件名
自定义多表头
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
ExcelColumnCollection ec
=
new
ExcelColumnCollection();
//
第一层表头
eb.AddColumnNamesCollection(ec);
ec.Add(
new
ExcelColumn(
"
基本信息
"
,
2
));
ec.Add(
new
ExcelColumn(
"
高级信息
"
,
2
));
ExcelColumnCollection ec2
=
new
ExcelColumnCollection();
//
第二层表头
eb.AddColumnNamesCollection(ec2);
ec2.Add(
new
ExcelColumn(
"
姓名
"
));
ec2.Add(
new
ExcelColumn(
"
性别
"
));
ec2.Add(
new
ExcelColumn(
"
学历
"
));
ec2.Add(
new
ExcelColumn(
"
政治面貌
"
));
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
以GridView的头为表
ExcelBook eb
=
new
ExcelBook(dt,
"
标题
"
);
eb.SetColumnNameFromGridViewHeadRow(gridView1.HeaderRow);
eb.IsAutoFitWidth
=
true
;
//
自定适用列宽
eb.WriteExcelToClient(
"
Excel文件名
"
);
//
下载Excel文件
有需要源代码或dll文件的请到我博客上下载:http://foxwoo.com/?p=46
相关文章推荐
- CarlosAg.ExcelXmlWriter实现.net下Excel导出功能(服务端不需要安装Excel程序)
- 导出合并后的多个工作表在一个EXCEL中,首先引用CarlosAg.ExcelXmlWriter.dll
- 实用的开放源码的Excel导入导出类库 CarlosAg ExcelXmlWriter
- Datatable转换成excel并实现导出功能,导出到服务端,提供客户端下载
- EXcel导出(服务端无须安装Excel程序)
- 服务器不安装Excel,实现导出Excel功能
- CarlosAg.ExcelXmlWriter 的确不错的写入Excel第三方控件
- 配置oracle instance client。不需要安装oracle客户端实现程序以及plsql连接oracle服务端
- [转载]EXcel导出(服务端无须安装Excel程序)
- asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台
- 一个免费的Excel输出类库:CarlosAg Excel Xml Writer Library
- CarlosAg.ExcelXmlWriter
- .NET -Myxls组件 导入导出Excel 服务器不需要安装Excel [魏言整理]
- 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程
- 在.NET程序中实现HttpServer功能
- 通过飞信的FetionVM的.net虚拟机来加载.net程序,实现在未安装.net的机器上运行.net程序
- Java 工具类 - 使用POI以及反射实现导出Excel的功能
- Apache-POI实现Excel文档的导出下载功能
- java利用POI导出Excel功能实现
- 使用插件实现一般处理程序导出excel