老话题:如何导出 Excel

马老虎 2010-05-19 12:28:45
以前的一个项目是用VS2003写的。
该项目中有个功能是导出Excel.使用的方法是 导出 Table 然后修改后缀名输出。

现在使用该项目的公司 统一将OFFICE2003升级成2007。于是出问题了!

导出的Excel 用2007打开有个提示

您尝试打开的文件“xxx.xls”的格式与文件扩展名指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?

以上是小问题,问题在于:将这个Excel做修改后,保存的时候以下提示


xxx.xls 可能含有与 电子表格 2003 不兼容的功能。是否保持工作簿的这种格式?

• 如要保持这种格式,去掉所有不兼容的功能,请单击“是”。
• 如要保留这些功能,请单击“否”。然后再用最新 Excel 格式保存一份副本。
• 如想知道哪些内容会丢失,请单击“帮助”。

是(Y) 否(N) 帮助(H)



根本无法正常保存,如果点击是。就会生成和文件夹里面是一些html文件(文件里就是拼成Table的数据)。

我在网上找了些方法:保存XML文件和Html都不行!

如果使用Com组件好像使用在BS网站中不合适。

从网上找到个不使用office组件的
http://juqiang.cnblogs.com/archive/2004/07/08/22255.html
初步在vs2005中使用没发现问题!

我现在问问大家现在在B/S网站 使用什么方法导出Excel?

谢谢!!!
...全文
473 46 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengNeeo 2011-03-02
  • 打赏
  • 举报
回复
谁试试了 给个正确答案贴出来
HolyPlace 2010-05-20
  • 打赏
  • 举报
回复
进来学习,关注...
lester19872007 2010-05-20
  • 打赏
  • 举报
回复

/// <summary>
/// 导出Excel文件可定制导出列名
/// </summary>
/// <param name="dt"></param>
/// <param name="hdt">数据库列名与导出显示列名映射表</param>
private void Export(DataTable dt, Hashtable hdt)
{
DataToExcel dte = new DataToExcel();

string folder = "~/Excel/";//网站根目录应有Excel文件夹存放导出文件
string path = MapPath(folder);
string filename = "";
filename = dte.DataExcel(dt, "学生", path, hdt);
byte[] down = null;;
if (filename != "")
{
try
{
//下载的超连接
down = SaveAndOpenExcelFile(folder, filename, "学生信息表");
Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312";

// 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Type", "application/ms-excel");
Response.AddHeader("Content-Disposition",
"attachment; filename=" + "stuInfo.xls" + "; size=" + down.Length.ToString());
Response.Flush();
Response.BinaryWrite(down);
Response.Flush();
Response.End();

}
catch
{
ClientScript.RegisterStartupScript(this.GetType(), "Copy", "alert('文件操作出错');", true);
}
}
}


/// <summary>
/// 使服务器没有多余的导出文件
/// </summary>
/// <param name="folder">相对网站根目录的文件夹</param>
/// <param name="filename">生成临时文件</param>
/// <param name="tableName">用户下载文件名</param>
/// <returns></returns>
public byte[] SaveAndOpenExcelFile(string folder, string filename, string tableName)
{
string FilePath = Server.MapPath(folder);
File.Copy(FilePath + "\\" + filename, FilePath + "\\" + tableName + ".xls", true);

FileStream fs = new FileStream(FilePath + "\\" + tableName + ".xls", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] byteTemp = br.ReadBytes((int)fs.Length);
fs.Close();

File.Delete(FilePath + "\\" + filename);
return byteTemp;
}

}
  • 打赏
  • 举报
回复
倒出2007 你就得看2007的
Response.ContentType
wuyq11 2010-05-19
  • 打赏
  • 举报
回复
导出XML文件
利用sql server导出一个xls到指定目录
导出成csv文件
string filename = "test.csv";
Response.Clear();
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
Response.ContentEncoding = Encoding.UTF8;
Response.Charset = "utf-8";
Response.Write("");
Response.End();
wuyi8808 2010-05-19
  • 打赏
  • 举报
回复
导出为CSV格式,Excel也可以打开的。
fuda_1985 2010-05-19
  • 打赏
  • 举报
回复
我这里导出使用的是office的excel组件,生成xls格式的,导出来使用office2007查看没你说的问题啊。
骑猪看海 2010-05-19
  • 打赏
  • 举报
回复
如有须要可进行深入探讨
骑猪看海 2010-05-19
  • 打赏
  • 举报
回复
可引入 Microsoft.Office.Interop.Excel 本人现在负责公司所有报表操作,目前全部是使用Microsoft.Office.Interop.Excel 导出的,包括后台绘制excel图表等
fxsy6669 2010-05-19
  • 打赏
  • 举报
回复
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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.Data.SqlClient;
using System.Reflection;
using Microsoft.Office.Core;
using System.IO;


public partial class Export : System.Web.UI.Page
{
DAO dao = new DAO();
protected void Page_Load(object sender, EventArgs e)
{
binder();
}

public void binder()
{
string sqlStr = "select * from UserInfos where 1=1 ";
if (txtName.Text.Trim() != "")
{
sqlStr += " and uname like '%" + txtName.Text.Trim() + "%'";
}
sqlStr += " order by uid desc";
DataSet ds=dao.getData(sqlStr);
this.GridView1.DataSource = ds;
this.GridView1.DataBind();
}


//导出Excel
protected void btnExportExcel_Click(object sender, EventArgs e)
{
DataGrid2Excel(this.GridView1);
}

//导出Word
protected void btnExportWord_Click(object sender, EventArgs e)
{
this.GridViewWord();
}

//查询
protected void brnSearch_Click(object sender, EventArgs e)
{
binder();
}

//导出Excel
public static void DataGrid2Excel(System.Web.UI.WebControls.GridView gv)
{
// 当前对话
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
// IO用于导出并返回excel文件
System.IO.StringWriter strWriter = null;
System.Web.UI.HtmlTextWriter htmlWriter = null;

if (gv != null)
{
// 设置编码和附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding =System.Text.Encoding.GetEncoding("gb2312");
curContext.Response.Charset = "gb2312";

// 导出excel文件
strWriter = new System.IO.StringWriter();
htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);

// 返回客户端
gv.RenderControl(htmlWriter);
curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
}

//导出Word
public void GridViewWord()
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.doc");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.Charset = "gb2312";
Response.ContentType = "application/vnd.ms-word ";
StringWriter sw= new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
GridView1.AllowPaging = false;
GridView1.DataBind();
GridView1.RenderControl(hw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();

}
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}

}
Ricercar 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 mmm306306 的回复:]

引用 37 楼 ricercar 的回复:
引用 36 楼 ricercar 的回复:

其实RenderControl方法导出的是html文件,只不过换了一个文件扩展名而已
myxls或者NPOI Library可以导入真正的excel文件,不需要excel,全托管的dll,LZ可以研究下


写错了,是导出

哎 这些控件 都在VS2003中不能用
[/Quote]

好像都是有源代码的,在2003中编译一下就行了
  • 打赏
  • 举报
回复
是不是你的excel在打开和修改状态呢?
有时候会因为这样报错
马老虎 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 ricercar 的回复:]
引用 36 楼 ricercar 的回复:

其实RenderControl方法导出的是html文件,只不过换了一个文件扩展名而已
myxls或者NPOI Library可以导入真正的excel文件,不需要excel,全托管的dll,LZ可以研究下


写错了,是导出
[/Quote]
哎 这些控件 都在VS2003中不能用
Ricercar 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 ricercar 的回复:]

其实RenderControl方法导出的是html文件,只不过换了一个文件扩展名而已
myxls或者NPOI Library可以导入真正的excel文件,不需要excel,全托管的dll,LZ可以研究下
[/Quote]

写错了,是导出
Ricercar 2010-05-19
  • 打赏
  • 举报
回复
其实RenderControl方法导出的是html文件,只不过换了一个文件扩展名而已
myxls或者NPOI Library可以导入真正的excel文件,不需要excel,全托管的dll,LZ可以研究下
马老虎 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 lovesongforever 的回复:]
用dev控件做导出Excel,只需一句代码,

不过要在客户机上装dev类库
[/Quote]
这个可是有点不现实!!
马老虎 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 jshi123 的回复:]
可以先做一个template.xls,然后复制到work.xls,把数据导出到work.xls
[/Quote]
哦 也是一种方法!!
我研究下!
garfieldzf 2010-05-19
  • 打赏
  • 举报
回复
用dev控件做导出Excel,只需一句代码,

不过要在客户机上装dev类库
jshi123 2010-05-19
  • 打赏
  • 举报
回复
可以先做一个template.xls,然后复制到work.xls,把数据导出到work.xls
马老虎 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jshi123 的回复:]
还可以用ado.net, 或者用sql或bcp直接导出
string sql = @"insert into OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;', 'select * from [Sheet1$]')(f1, f2, f3)
select f1,f2,f3 from [y……
[/Quote]
这也是一种方法,但是导出的Excel不是很灵活,不能设置表头
加载更多回复(26)

62,243

社区成员

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

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

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

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