这是我的代码,简写的,省去了数据库中的代码protected void Button1_Click(object sender, EventArgs e)
    {
        string filename ="河北省国土资源厅专项资金项目登记表.doc";
        string file = Server.MapPath("~") + "\\word\\" + "河北省国土资源厅专项资金项目登记表.doc";
        string file1 = Server.MapPath("~") + "\\moban\\" + "河北省国土资源厅专项资金项目登记表.doc";        File.Copy(file, file1);
        if (CreateWord(nXMID, file1))
        {
            Response.Clear();
            Response.Buffer = true;
            Response.Charset = "gb2312";
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.ContentType = "application/ms-word";
            this.EnableViewState = false;
            Response.WriteFile(file1);
            Response.Flush();
            File.Delete(file1);
            Response.End();
        }
    }     
        public static bool CreateWord(int nXMID ,string file)
{
object missing = System.Reflection.Missing.Value;
object fileName = (Object)file;
Microsoft.Office.Interop.Word.Document myWord;
Microsoft.Office.Interop.Word.Application wordApp = new ApplicationClass();
myWord = wordApp.Documents.Open(ref fileName, ref missing,ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,ref missing,ref missing,ref missing,ref missing);                           string cXMYuSuanBianHao = "900119576";
                           myWord.Tables[1].Cell(2, 2).Range.Text = cXMYuSuanBianHao;
           
                foreach (Microsoft.Office.Interop.Word.Book bm in myWord.Books)
                {
                    switch (bm.Name)
                    {
                        case "Bianhao":
                            bm.Select();
                            bm.Range.Text = cXMYuSuanBianHao;
                            break;
                    }
                }
myWord.Close( ref missing,ref missing, ref missing);
wordApp.Quit( ref missing,ref missing, ref missing);
return true;
}
第一个问题:关于字符集Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
如果我用的GB2312替换UTF-8,文件名就会出现乱码,这是为什么?  Response.Charset = "gb2312";Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");这些都是对什么指定的字符集?第二个问题:Response.Buffer 在这里起的是什么作用,用Response.WriteFile(file1)的话 为什么需要缓存,我查别人写的代码有的就没有写这句话,但是我去掉这句话,页面一直在加载第三个问题:除了这些代码,还需要配置什么吗?比如说要配置下office,应该怎样操作。我在本机实验时没问题,放到服务器上就会保存,好像是在组件服务中设置些东西对这些东西没有过深入的了解,希望大家帮忙解决下,谢谢

解决方案 »

  1.   

    gb2312和UTF-8有什么本质区别吗?  unicode和ASCII吗有什么区别,他们之间是怎么对应的??  网页默认情况下是用什么字符集,对字符是用什么码(ascii码还是unicode还是别的)存储的有点乱 ,谢谢大家帮忙解答下
      

  2.   

    ASCII编码与EBCDIC编码
      在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。那么字母”A”在硬盘上是如何存储的呢?可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到2进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统(MVS 、OS/390等)采用EBCDIC 编码。在发送数据给对方前,需要事先告知对方自己所使用的编码,或者通过转码,使不同编码方案的两个系统可沟通自如。
      ASCII码使用7位2进制数表示一个字符,这样,7位2进制数可以表示出2的7次方个字符,共128个字符。EBCDIC码使用8位,可以表示出2的8次方个字符,256个字符。
      无论是ASCII码还是EBCDIC码,都无法对拥有几万个的汉字进行编码。因为上面已经提过,7位2进制数最多对应上128个字符,8位最多对应上256个字符。
      GB2312编码
      于是中国的标准化组织就出台了GB2312简体中文编码。GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。但这种编码方式也仅仅在中国行得通,如果您的网页使用的GB2312编码,那么很多外国人在浏览你的网页时就可能无法正常显示,因为其浏览器不支持GB2312编码。当然,中国人在浏览外国网页(比如日文)时,也会出现乱码或无法打开的情况,因为我们的浏览器没有安装日文的编码表。
      Unicode编码
      如上所述,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者和信息的读取者使用了不同的编码方式。
      如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。
      Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。
      Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
      UTF-8编码
      为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
      UTF-8的编码是这样得出来的,以”汉”这个字为例:
      “汉”字的Unicode编码是U+00006C49,然后把U+00006C49通过UTF-8编码器进行编码,最后输出的UTF-8编码是E6B189。
      Base64编码
      有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输,这是历史原因造成的(认为只有美国会使用电子邮件?)。因为一个英文字母使用ASCII编码来存储,占存储器的1个字节(8位),实际上只用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。而有的编码方案(比如GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0,这样收到邮件的人就会发现邮件乱码。
      为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。比如,在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码。
    数据导入到word 可以这样做:先把数据放在GridView中然后再从GridView中导出到word.下面是代码:
    protected void Button1_Click(object sender, EventArgs e)
        {
            Export("application/ms-word", "学生成绩报表.xls");
        }    private void Export(string FileType, string FileName)
        {
            Response.Charset = "GB2312";
            Response.ContentEncoding = System.Text.Encoding.UTF7;
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
            Response.ContentType = FileType;
            this.EnableViewState = false;
            StringWriter tw = new StringWriter();
            HtmlTextWriter hw = new HtmlTextWriter(tw);
            GridView1.RenderControl(hw);
            Response.Write(tw.ToString());
            Response.End();
        }
    //如果没有下面方法会报错类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内
        public override void VerifyRenderingInServerForm(Control control)
        {
        }
      

  3.   

    protected void Button1_Click(object sender, EventArgs e) 
        { 
            Export("application/ms-word", "学生成绩报表.xls"); 
        }     private void Export(string FileType, string FileName) 
        { 
            Response.Charset = "GB2312"; 
            Response.ContentEncoding = System.Text.Encoding.UTF7; 
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString()); 
            Response.ContentType = FileType; 
            this.EnableViewState = false; 
            StringWriter tw = new StringWriter(); 
            HtmlTextWriter hw = new HtmlTextWriter(tw); 
            GridView1.RenderControl(hw); 
            Response.Write(tw.ToString()); 
            Response.End(); 
        } 
    //如果没有下面方法会报错类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内 
        public override void VerifyRenderingInServerForm(Control control) 
        { 
        }  这样写应该不会也错啊
    还有在Html中加上<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" EnableEventValidation="false" %>
    EnableEventValidation="false"属性加上去啊不然导入控件会出错啊
      

  4.   

    第一个问题,只是解决标题是否乱码.就是用了utf-8有时导出来的word打开之后,还是乱码.
    第二个问题,Buffer是缓冲的意思.如果写上,是效果会好一点因为客户端所获得的数据可以从程序的执行结果直接输出,也可以从缓冲区输出.
    第三个问题.不必设置什么.另外,解决导出来之后,word内部还是乱码的问题,您需要建一个临时文件夹,先导出至这个文件夹中,再下载,即可.
    更多的参考:
    http://www.cnblogs.com/insus/articles/1400266.html