现在的位置: 首页 > 综合 > 正文

C# 导出word 和中文乱码

2017年08月17日 ⁄ 综合 ⁄ 共 3287字 ⁄ 字号 评论关闭
<pre name="code" class="csharp"><pre name="code" class="csharp">   protected void btnWord_Click(object sender, EventArgs e)
        {
            string strSql = "SELECT语句filename";
            string filename = this.Sql.GetString(strSql) + DateTime.Now.ToString("yyyyMMdd");
            strSql = "SELECT 主循环";
            DataTable dt = GetDataTable(strSql);
            if (dt.Rows.Count == 0 || dt == null)
            {
                this.MsgBox("读取数据失败!");
                return;
            }
			//这块就像html里面类似
            Response.ContentType = "application/msword";
            Response.ContentEncoding = System.Text.Encoding.UTF8;
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + ToHexString(filename) + ".doc");//ToHexString(filename)防止中文乱码
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                strSql = "SELECT 子循环";
                DataTable dtview = this.Sql.GetDataTable(strSql);
                if (dtview.Rows.Count > 0)
                {
                    sb.Append("<table><tr><td colspan='3' width='1000' align='center'>Tilte公司</td><tr>");
                    sb.Append("<tr><td colspan='3' width='1000'  align='center'>Title标题</td></tr>");
                    sb.AppendFormat("<tr><td width='300' align='left'>作业:{0}</td><td  width='400' align='center'>单位:{1}</td><td  width='300' align='right'>编号:{2}</td></tr>", dt.Rows[i]["列名"].ToString(), dt.Rows[i]["列名"].ToString(), dt.Rows[i]["列名"].ToString());
                    sb.AppendFormat("<tr><td align='left'>日 期:{0}</td><td></td><td align='right'>期间:{1}</td></tr></table>", DateTime.Parse(dtview.Rows[0]["列名"].ToString()).ToString("yyyy-MM-dd"), dt.Rows[i]["列名"].ToString());
                    sb.Append("<table  border='1'><tr><th rowspan='2' width='420'>重  点</th><th colspan='3' width='160'>标 准</th><th rowspan='2' width='420'>结果<th></tr><tr><th>是</th><th>否</th><th>不适用</th></tr>");
                    for (int j = 0; j < dtview.Rows.Count; j++)
                    { 
                        sb.AppendFormat("<tr><td width='420'>{0}</td>", (j + 1).ToString() + "." + dtview.Rows[j]["列名"].ToString());
                        switch (int.Parse(dtview.Rows[j]["lngrule"].ToString()))
                        {
                            case 1:
                                sb.AppendFormat("<td>{0}</td><td></td><td></td>", "√");
                                break;
                            case 2:
                                sb.AppendFormat("<td></td><td>{0}</td><td></td>", "√");
                                break;
                            case 3:
                                sb.AppendFormat("<td></td><td></td><td>{0}</td>", "√");
                                break;
                        }
                        sb.AppendFormat("<td width='420'>{0}</td>", dtview.Rows[j]["列名"].ToString());
                        sb.Append("</tr>");
                    }
                    sb.Append("</table>");
                    sb.Append("<table><tr><td colspan='5' height='25'></td><td colspan='5'></td><td colspan='5' height='25'></td></tr></table>");
                }
            }
            Response.Write(sb.ToString());
            Response.End();
        }
		
		
		#region 保存word中文名称乱码
        /// <summary>  
        /// 为字符串中的非英文字符编码  
        /// </summary>  
        /// <param name="s"></param>  
        /// <returns></returns>  
        public string ToHexString(string s)
        {
            char[] chars = s.ToCharArray();
            StringBuilder builder = new StringBuilder();
            for (int index = 0; index < chars.Length; index++)
            {
                bool needToEncode = NeedToEncode(chars[index]);
                if (needToEncode)
                {
                    string encodedString = ToHexString(chars[index]);
                    builder.Append(encodedString);
                }
                else
                {
                    builder.Append(chars[index]);
                }
            }
            return builder.ToString();
        }

        /// <summary>  
        ///指定 一个字符是否应该被编码  
        /// </summary>  
        /// <param name="chr"></param>  
        /// <returns></returns>  
        private bool NeedToEncode(char chr)
        {
            string reservedChars = "$-_.+!*'(),@=&";
            if (chr > 127)
                return true;
            if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
                return false;
            return true;
        }

        /// <summary>  
        /// 为非英文字符串编码  
        /// </summary>  
        /// <param name="chr"></param>  
        /// <returns></returns>  
        private string ToHexString(char chr)
        {
            UTF8Encoding utf8 = new UTF8Encoding();
            byte[] encodedBytes = utf8.GetBytes(chr.ToString());
            StringBuilder builder = new StringBuilder();
            for (int index = 0; index < encodedBytes.Length; index++)
            {
                builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
            }
            return builder.ToString();
        }
        #endregion


抱歉!评论已关闭.