none
asp.net 导出EXCEL,在EXCEL07中可以打开,03打开出现乱码? RRS feed

  • 问题

  • 我在程序中,调用的是Microsoft Excel 12.0 Object Library

    成生完EXCEL后,用以下代码下载:

    string path = Server.MapPath(Filename);
            System.IO.FileInfo file = new System.IO.FileInfo(path);
            Response.Clear();

    Response.Charset = "gb2312";

            Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.Name));

            Response.AddHeader("Content-Length", file.Length.ToString());

     
            Response.ContentType = "application/ms-excel";

            Response.WriteFile(file.FullName);

            Response.End();

    这是可以下载成功,用2007打开是无问题,但2003就是乱码。为什么呢?

    是Excel.dll的问题?还是下载代码的问题呢??

    谢谢

     


    ***********

     

     

     

     

    补充:2010-07-08 上午10:28

    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;
    
    public partial class _Default : System.Web.UI.Page 
    {
     protected void Page_Load(object sender, EventArgs e)
     {
    
     }
     protected void Button1_Click(object sender, EventArgs e)
     {
      OutputExcel();
     }
    
     private void OutputExcel()
     {
      string Filename = "Traffic.xls";
      GC.Collect();
      Excel.Application excel;
      int rowIndex = 1;
      int colIndex = 0;
      Excel._Workbook xBk;
      Excel._Worksheet xSt;
    
    
      excel = new Excel.ApplicationClass();
      xBk = excel.Workbooks.Add(true);
      xSt = (Excel._Worksheet)xBk.ActiveSheet;
    
    
      excel.Cells[1, 1] = "测试数据1";
      excel.Cells[1, 2] = "测试数据2";
    
    
      //显示效果
      excel.Visible = true;
    
      xBk.SaveCopyAs(Server.MapPath(".") + "\\" + Filename);
      xBk.Close(false, null, null);
    
      excel.Quit();
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
      xBk = null;
      excel = null;
      xSt = null;
      GC.Collect();
    
      string path = Server.MapPath(Filename);
      System.IO.FileInfo file = new System.IO.FileInfo(path);
      Response.Clear();
      Response.Buffer = true;
      Response.Charset = "";
      Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.Name));
      Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
      EnableViewState = false;
      Response.WriteFile(file.FullName);
      Response.End();
     }
    }
    

    上面就是一个例子代码,

    说明:服务器环境是装了office 2007,上面例子中引用的EXCEL.DLL是1.3.0.0版。。。

    导出EXCEL后,在装有office 2007的电脑上,打开时,提示“你尝试打开的文件“Traffic.xls”的格式与文件扩展指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?”,

    在装有office 2003的电脑上,打开时,提示“不能识别的文件格式。。。。。。”,确定后打开的就是乱码了。

     

     

    不知道问题出在那里?

    麻烦各位大哥和版主。。。。。帮帮助。。。。

    • 已编辑 mick122 2010年7月8日 2:29 补充问题
    2010年7月5日 9:24

全部回复

  • Response.Charset = "gb2312";设置为Response.Charset = "";

    应该就可以了

    2010年7月5日 10:52
  • Response.Charset = "gb2312";

    ===>

    你确定你的后台是编码是gb2312吗?如果不是改成正确的,如UTF-8


    cpp2017(慕白兄)
    2010年7月5日 12:47
  • Response.ContentEncoding = System.Text.Encoding.UTF7;
    【孟子E章】
    2010年7月6日 0:52
    版主
  • Response.Charset = "gb2312";

    ===>

    你确定你的后台是编码是gb2312吗?如果不是改成正确的,如UTF-8


    cpp2017(慕白兄)

    请问如何知道我后台的编码呀》??
    ***********
    2010年7月6日 1:15
  • Response.Charset = "gb2312";设置为Response.Charset = "";

    应该就可以了


    还是不行呀
    ***********
    2010年7月6日 2:54
  • 试试在web.config中做如下配置:

     <globalization requestEncoding="gb2312" responseEncoding="gb2312" />

    Microsoft Online Community Support
    2010年7月7日 3:12
  • 试试在web.config中做如下配置:

     <globalization requestEncoding="gb2312" responseEncoding="gb2312" />

    Microsoft Online Community Support


    试了。还是不行!

    我觉得应该是调用的DLL问题吧!

    我电脑的环境:VS2005    ,office 2007

    我试过在引用EXCEL 2003的DLL,成生的文件名是“abc.xls”,但导出的EXCEL文件还是一样的问题,在用EXCEL 2007打开,会提示“你尝试打开的文件“abd.xls”的格式与文件扩展指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?”。

    点“是”,是可以打开的。但在EXCEL 2003打开就提示“不能识别的文件格式。。。。。。”,确定后打开的就是乱码了。

     

    另补充:

    用EXCEL 2007打开后,另存为97-2003格式的EXCEL后,再用2003打开就无问题的。

     

    综上所述,应该是DLL的问题吧??望版主帮帮忙。。。要怎样解决。。。。

     

     

     


    ***********
    2010年7月7日 3:40
  • Microsoft Excel 12.0 Object Library是excel2007的吧。

    试试Microsoft Excel 11.0 Object Library,这个是2003的。

    不知道你是怎么调用上面的组件导入到excel的,如果你是调用了上面的组件,那使用2003对应的低版本的试试。

     

     


    Microsoft Online Community Support
    2010年7月7日 3:56
  • Microsoft Excel 12.0 Object Library是excel2007的吧。

    试试Microsoft Excel 11.0 Object Library,这个是2003的。

    不知道你是怎么调用上面的组件导入到excel的,如果你是调用了上面的组件,那使用2003对应的低版本的试试。

     

     


    Microsoft Online Community Support

    对,但我在工程里试过引用了2003的EXCEL.DLL,也试过用2000的EXCEL.DLL,还是一样的结果。

    我是在想,会不会是我电脑上装了2007的EXCEL,程序运行时,是用了2007的DLL去生成文件,而不是用本工程里引用的DLL去生成文件。会不会有一个机制强行指定用工程引用的DLL生成文件的东东??

     


    ***********
    2010年7月7日 4:04
  • 直接链接文件下载下来也是如此?
    Ferry
    2010年7月7日 4:09
  • 应该不会,你工程里引用的是哪个版本就应该是哪个。

     


    Microsoft Online Community Support
    2010年7月7日 4:13
  • 直接链接文件下载下来也是如此?
    Ferry


    我这个是一个导出EXCEL的功能,把GRIDVIEW数据导出。

    我是先用

    Excel.Application excel;
            Excel._Workbook xBk;
            Excel._Worksheet xSt;

    .......

    成生完EXCEL后,用以下代码下载:

    //Filename是EXCEL文件名

    string path = Server.MapPath(Filename);
            System.IO.FileInfo file = new System.IO.FileInfo(path);
            Response.Clear();

    Response.Charset = "gb2312";

            Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.Name));

            Response.AddHeader("Content-Length", file.Length.ToString());

     
            Response.ContentType = "application/ms-excel";

            Response.WriteFile(file.FullName);

            Response.End();

     


    ***********
    2010年7月7日 4:15
  • Gridview数据导出到excel,不需要用到excel的组件的。

    你参考下面的例子试试:

    http://social.microsoft.com/Forums/zh-CN/295/thread/6fba16a6-1647-449a-bfff-0a9b2bcb5300/


    Microsoft Online Community Support
    2010年7月7日 4:23
  • Micky你好

    有沒有試過把

    Response.Charset = "gb2312"; 轉成 Response.Charset = "UTF7"...

    Response.ContentEncoding = System.Text.Encoding.UTF7;


    Chi
    2010年7月7日 4:24
  • Micky你好

    有沒有試過把

    Response.Charset = "gb2312"; 轉成 Response.Charset = "UTF7"...

    Response.ContentEncoding = System.Text.Encoding.UTF7;


    Chi

     

    都试过了。。。问题还是一样!


    ***********
    2010年7月7日 4:27
  • Gridview数据导出到excel,不需要用到excel的组件的。

    你参考下面的例子试试:

    http://social.microsoft.com/Forums/zh-CN/295/thread/6fba16a6-1647-449a-bfff-0a9b2bcb5300/


    Microsoft Online Community Support

    嗯,好的,我看看。。。谢谢
    ***********
    2010年7月7日 4:28
  • 你好
    有沒有機會在另人電腦的OFFICE 2003 試試
    看是不是字體的問題 OFFICE 2003 沒有這種字體,

    介不介意UPLOAD 一個SAMPLE FILE 給我們試試


    Chi
    2010年7月7日 6:03
    • 已建议为答案 Roy Ming 2010年7月7日 6:21
    2010年7月7日 6:21
  • 设置 Response.Charset = "";

    见这个地址 http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/ba05c482-3f98-4cb0-ae43-5507c8bd49ea


    看过。。试了还是不行。。。
    ***********
    2010年7月8日 2:16
  • 你好
    有沒有機會在另人電腦的OFFICE 2003 試試
    看是不是字體的問題 OFFICE 2003 沒有這種字體,

    介不介意UPLOAD 一個SAMPLE FILE 給我們試試


    Chi

    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;
    
    public partial class _Default : System.Web.UI.Page 
    {
      protected void Page_Load(object sender, EventArgs e)
      {
    
      }
      protected void Button1_Click(object sender, EventArgs e)
      {
        OutputExcel();
      }
    
      private void OutputExcel()
      {
        string Filename = "Traffic.xls";
        GC.Collect();
        Excel.Application excel;
        int rowIndex = 1;
        int colIndex = 0;
        Excel._Workbook xBk;
        Excel._Worksheet xSt;
    
    
        excel = new Excel.ApplicationClass();
        xBk = excel.Workbooks.Add(true);
        xSt = (Excel._Worksheet)xBk.ActiveSheet;
    
    
        excel.Cells[1, 1] = "测试数据1";
        excel.Cells[1, 2] = "测试数据2";
    
    
        //显示效果
        excel.Visible = true;
    
        xBk.SaveCopyAs(Server.MapPath(".") + "\\" + Filename);
        xBk.Close(false, null, null);
    
        excel.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
        xBk = null;
        excel = null;
        xSt = null;
        GC.Collect();
    
        string path = Server.MapPath(Filename);
        System.IO.FileInfo file = new System.IO.FileInfo(path);
        Response.Clear();
        Response.Buffer = true;
        Response.Charset = "";
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.Name));
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
        EnableViewState = false;
        Response.WriteFile(file.FullName);
        Response.End();
      }
    }

    上面就是一个例子代码,

    说明:服务器环境是装了office 2007,上面例子中引用的EXCEL.DLL是1.3.0.0版。。。

    导出EXCEL后,在装有office 2007的电脑上,打开时,提示“你尝试打开的文件“Traffic.xls”的格式与文件扩展指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?”,

    在装有office 2003的电脑上,打开时,提示“不能识别的文件格式。。。。。。”,确定后打开的就是乱码了。

     

     

    不知道问题出在那里?

    麻烦各位大哥和版主。。。。。帮帮助。。。。


    ***********
    2010年7月8日 2:27
  • 以下有一段导出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;
    
    
    
    public partial class _Default : System.Web.UI.Page 
    
    {
    
     protected void Page_Load(object sender, EventArgs e)
    
     {
    
    
    
     }
    
     protected void Button1_Click(object sender, EventArgs e)
    
     {
    
     OutputExcel();
    
     }
    
    
    
     private void OutputExcel()
    
     {
    
     string Filename = "Traffic.xls";
    
     GC.Collect();
    
     Excel.Application excel;
    
     int rowIndex = 1;
    
     int colIndex = 0;
    
     Excel._Workbook xBk;
    
     Excel._Worksheet xSt;
    
    
    
    
    
     excel = new Excel.ApplicationClass();
    
     xBk = excel.Workbooks.Add(true);
    
     xSt = (Excel._Worksheet)xBk.ActiveSheet;
    
    
    
    
    
     excel.Cells[1, 1] = "测试数据1";
    
     excel.Cells[1, 2] = "测试数据2";
    
    
    
    
    
     //显示效果
    
     excel.Visible = true;
    
    
    
     xBk.SaveCopyAs(Server.MapPath(".") + "\\" + Filename);
    
     xBk.Close(false, null, null);
    
    
    
     excel.Quit();
    
     System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
    
     System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
    
     System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
    
     xBk = null;
    
     excel = null;
    
     xSt = null;
    
     GC.Collect();
    
    
    
     string path = Server.MapPath(Filename);
    
     System.IO.FileInfo file = new System.IO.FileInfo(path);
    
     Response.Clear();
    
     Response.Buffer = true;
    
     Response.Charset = "";
    
     Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.Name));
    
     Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
    
     EnableViewState = false;
    
     Response.WriteFile(file.FullName);
    
     Response.End();
    
     }
    
    }
    
    

    上面就是一个例子代码,

    说明:服务器环境是装了office 2007,上面例子中引用的EXCEL.DLL是1.3.0.0版(都试过用1.4.0.0和1.6.0.0结果都是一样)。。。

    导出EXCEL后,在装有office 2007的电脑上,打开时,提示“你尝试打开的文件“Traffic.xls”的格式与文件扩展指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?”,

    在装有office 2003的电脑上,打开时,提示“不能识别的文件格式。。。。。。”,确定后打开的就是乱码了。

     

     

    不知道问题出在那里?

    麻烦各位大哥和版主。。。。。帮帮助。。。。


    ***********

    同前两日发的贴问的问题是一样的!以下是前两天的贴,没解决到

    http://social.microsoft.com/Forums/zh-CN/295/thread/33222072-b30f-4ad7-8428-757b5f7fb961

    2010年7月8日 6:44
  • 你好

    你需要SAVE 你的檔案做".XLSX"

    如果SAVE 成 ".XLS" 便會有這個提示 "你尝试打开的文件“Traffic.xls”的格式与文件扩展指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?"

    或者試試安裝 "Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formats"看看能不能解決這個亂碼問題

    http://www.microsoft.com/downloads/details.aspx?familyid=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displaylang=en

    安裝了後OFFICE 2003便可以開啓OFFICE 2007 FORMAT 的 FILE E.G. .XLSX

    希望可以幫到你


    Chi
    2010年7月8日 9:33
  • 你好

    你需要SAVE 你的檔案做".XLSX"

    如果SAVE 成 ".XLS" 便會有這個提示 "你尝试打开的文件“Traffic.xls”的格式与文件扩展指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?"

    或者試試安裝 "Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formats"看看能不能解決這個亂碼問題

    http://www.microsoft.com/downloads/details.aspx?familyid=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displaylang=en

    安裝了後OFFICE 2003便可以開啓OFFICE 2007 FORMAT 的 FILE E.G. .XLSX

    希望可以幫到你


    Chi


    谢谢!

    这个办法我也想过,但不够实际。

    有办法解决我提到的问题吗?求救。。。。。SOS


    ***********
    2010年7月8日 10:07
  • 你好
    不够实际 是 安裝 "Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formats" 嗎 <- 但-如果你沒有安裝的話是應該在OFFICE2003中開不到 OFFICE 2007 格式的 FILE 的

    還是 SAVE 你的檔案做".XLSX"? 因為你EXPORT 出來的FILE FORMAT 是 OFFICE 2007的所以即使你SAVE做.XLS 最後也會用開XLSX 的方法開這個FILE

    你試過未有? 可不可以試試這能不能解決這個問題?

    或者你可以試試
    開EXCEL2007 中 打下一些文字 之後看看OFFICE 2003 開這個FILE 時有沒有亂碼

    Please correct me if my concept is wrong


    Chi
    2010年7月8日 10:18
  • Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312")
    Excel文件不是文本文件,是二进制数据……


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年7月8日 13:43
    版主
  • Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312")
    Excel文件不是文本文件,是二进制数据……


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    那应该怎么做呢》?

    ***********
    2010年7月9日 1:42
  • Generating an Excel Workbook with Audit Log Information 

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年7月9日 2:03
    版主
  • 你先别下载,看看你服务器端生成的文件直接打开时乱的吗?
    【孟子E章】
    2010年7月9日 3:12
    版主
  • Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"
    )
    Excel文件不是文本文件,是二进制数据……


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    那应该怎么做呢》?

    ***********

    使用FileStream,

    你的FileInfo那段没有任何作用


    【孟子E章】
    2010年7月9日 3:14
    版主
  • Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"
    
    )
    Excel文件不是文本文件,是二进制数据……


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    那应该怎么做呢》?

    ***********

    使用FileStream,

    你的FileInfo那段没有任何作用


    【孟子E章】
    正在尝试别的方法。。。

    ***********
    2010年7月9日 3:21
  • 和大家说的什么编码是没有关系的.

    楼主使用的这种导出方法,在本地导出时,文件是根据客户端机器上安装的EXCEL的版本来生成的,因为你的机子上是2007版的,所以你能打开,但保存后拿到别人的2003上是乱码,但如果你的机子是2003版的EXCEL,这时你就能打开了

    使用这种导出方法,好像目前除拷贝数据后"另存为"一下,没有其它好的解决办法

    楼主可以尝试其它的导出办法,包括调用服务器端的EXCEL组件,或使用客户端JS脚本导出的方法.

    2010年7月20日 14:42
  • 今天遇到了和lz一模一样的问题,而且,是原本一直正常的代码,突然就出问题了。

    看到很多人怀疑Charset的问题,也开始也怀疑,而且,这个版本为处理中文专门修改过Charset,所以自然觉得是这方面的问题。但改来改去,查来查去,我觉得算是找到问题的本质了,而且很气人。

    我原来存的文件后缀是.xls,2003打开乱码,2007打开提示扩展名有问题。当我直接把文件名后缀改成“.xlsx”之后,就一切正常了。也就是说,程序按照office2007/2010的格式生成的文件,而不是2003或之前的格式。

    在调试过程中,我用SaveAs方法,并设置fileformat参数,Excel9597不能用,改用CSV格式,能够解决问题。

    http://www.cnblogs.com/dotAge/archive/2008/10/22/1317053.html 这篇文章似乎说得也是这个问题,指出的原因也很清楚。

    另外更气人的是,我引用的excel.dll是用那个工具从Offce 2003的Excel.exe导出的Dll,而不是Microsoft.Office 11的库,所以完全没想过excel版本会出问题。可能与我的环境上Office 2003/2010都存在有关。

    2010年12月24日 14:37