分享:将DataGrid内容生成标准的Excel格式文件

codeangel 2007-05-24 01:05:34
前言

用传统的导出方法:只是将DataGrid信息用html输出,文件名后辍是.xls而已。
如果想将这个方法导入到Sql Server 中,会提示出错。因为它不是标准的Excel格式文件。

用本例中的导出方法:会输出标准的Excel格式文件,非常稳定,不会死锁Excel进程,支持中文文件名,支持表头导出,
支持大多数数据库导入。
实现算法:

利用Excel组件将DataGrid控件内容生成Excel临时文件,并存放在服务器上,然后用Response方法将生成的Excel文件下载到客户

端然后再将生成的临时文件删除。

具体步骤:
1.在项目中引用Excel组件
Interop.Excel.dll 文件版本1.3.0.0
2.项目中应有一个目录(本例中Template目录),以便存放Excel文件(名字自己定)
3.导入方法类

protected void ExportToExcel(System.Web.UI.WebControls.DataGrid grid,string fileName)
{
string templetFilePath;
templetFilePath = Server.MapPath("../").ToString() + @"Template\";
object missing = Missing.Value;
Excel.Application app;
Excel.Workbook workBook;
Excel.Worksheet workSheet;
Excel.Range range;


//创建一个Application对象并使其不可见
app = new Excel.ApplicationClass();
app.Visible=false;


//打开模板文件,得到WorkBook对象
//workBook = app.Workbooks.Open(templetFilePath + "SuperTemplet.xls", missing, missing, missing,

missing, missing,
// missing, missing, missing, missing, missing, missing, missing);

//创建一个WorkBook对象
workBook = app.Workbooks.Add(missing);
//得到WorkSheet对象
workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

int rowCount = grid.Items.Count + 1; //DataTable行数+GirdHead(因为DataGrid头还有一例所以得加1)
int colCount = grid.Columns.Count; //DataTable列数

//利用二维数组批量写入
string[,] arr = new string[rowCount, colCount];

for (int j = 0; j < rowCount; j++)
{
for (int k = 0; k < colCount; k++)
{
if (j == 0)
{
arr[j, k] = grid.Columns[k].HeaderText;

}
else
{
arr[j, k] = grid.Items[j - 1].Cells[k].Text.ToString();
}
}
}

range = (Excel.Range)workSheet.Cells[1, 1]; //写入Exel的坐标
range = range.get_Resize(rowCount, colCount);
range.Value = arr;

workBook.SaveAs(templetFilePath + fileName, missing, missing, missing, missing,

missing,Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing);

if (workBook.Saved)
{
workBook.Close(null, null, null);
app.Workbooks.Close();
app.Quit();
}

if (range != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
range = null;
}

if (workSheet != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
workSheet = null;
}
if (workBook != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
workBook = null;
}
if (app != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app = null;
}

GC.Collect();//强制代码垃圾回收

//下载文件
DownLoadFile(templetFilePath,fileName);
}
4.下载文件方法类
/// <summary>
/// 下载服务器文件
/// </summary>
/// <param name="_FilePath">文件路径</param>
/// <param name="_FileName">文件名</param>
/// <returns>返回 bool型</returns>
private bool DownLoadFile(string _FilePath,string _FileName)
{
try
{
System.IO.FileStream fs = System.IO.File.OpenRead(_FilePath+_FileName);
byte[] FileData = new byte[fs.Length];
fs.Read(FileData, 0, (int)fs.Length);
Response.Clear();
Response.AddHeader("Content-Type", "application/ms-excel");
string FileName = System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(_FileName));
Response.AddHeader("Content-Disposition", "inline;filename=" + System.Convert.ToChar(34) + FileName

+ System.Convert.ToChar(34));
Response.AddHeader("Content-Length", fs.Length.ToString());
Response.BinaryWrite(FileData);
fs.Close();
//删除服务器临时文件
System.IO.File.Delete(_FilePath+_FileName);
Response.Flush();
Response.End();

return true;
}
catch(Exception ex)
{
ex.Message.ToString();
return false;
}
}
5.应用方法
protected void btnExportToExcel_Click(object sender, EventArgs e)
{

this.ExportToExcel(grdBudget,"油管厂发料记录.xls");//grdBudget 是DataGrid的ID

}
此文出处:www.wsoft.net
原文地址:http://www.wsoft.net/Index/Catalog53/225.aspx
...全文
2040 69 打赏 收藏 转发到动态 举报
写回复
用AI写文章
69 条回复
切换为时间正序
请发表友善的回复…
发表回复
xigl0727 2009-03-11
  • 打赏
  • 举报
回复
很好
「已注销」 2008-08-31
  • 打赏
  • 举报
回复
谢谢分享
lzh_ok 2008-08-31
  • 打赏
  • 举报
回复
顶,楼主辛苦了
63880880 2008-08-31
  • 打赏
  • 举报
回复
up!
liyingzi 2007-12-06
  • 打赏
  • 举报
回复
添加引用 Interop.Excel.dll 方法:网站-添加引用-COM-microsoft excel 11.0 objcet library 1.5 (我的是office 2003)-出来这个Interop.Excel.dll
liyingzi 2007-12-06
  • 打赏
  • 举报
回复
添加引用 Interop.Excel.dll 方法:网站-添加引用-COM-microsoft excel 11.0 objcet library 1.5 (我的是office 2003)-出来这个Interop.Excel.dll
free1949 2007-07-05
  • 打赏
  • 举报
回复
楼主是好人啊。
kofkyo 2007-06-20
  • 打赏
  • 举报
回复
谢谢楼主分享
wizardlun 2007-06-20
  • 打赏
  • 举报
回复
支持
xuezj508 2007-06-20
  • 打赏
  • 举报
回复
好东西
longjia 2007-06-20
  • 打赏
  • 举报
回复
谢谢啦
cansum396 2007-06-20
  • 打赏
  • 举报
回复
看看
licaiks 2007-06-07
  • 打赏
  • 举报
回复
我现在正在研究这个东西,楼主给的例子,的确很好.我绝对的支持
yok77 2007-06-05
  • 打赏
  • 举报
回复
hdx
mark!
szh3210 2007-06-05
  • 打赏
  • 举报
回复
mark
yangshibing 2007-06-04
  • 打赏
  • 举报
回复
DataGrid 中 ,前边一个单选框,每一条数据都可以单独导入到一个定义好的Excel中.单独打印,你也可以选择全选,进行批量打印,请问这个该怎么实现??
yangshibing 2007-06-04
  • 打赏
  • 举报
回复
楼主,谢谢了,对了,问个问题,这样能实现批量打印吗?,如果有代码可不可以提供下,也就是说一条纪录生成一个标准的Excel,在DataGrid加入复选框,点击全选,然后循环打印,类似于通知单打印一样的,每个学生有条纪录。
nosuchtracter 2007-06-04
  • 打赏
  • 举报
回复
mark
「已注销」 2007-06-04
  • 打赏
  • 举报
回复
顶了,楼主,辛苦了!!!
lengchenghao 2007-06-04
  • 打赏
  • 举报
回复
真是好东西!我一直找了很久!我自己实现的方式真的没有这个好!谢谢提供者!万分感激!
加载更多回复(48)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧