C# world模板中写信息

            看到有博客园朋友需要往world中写内容相关代码,我就简单写一下。其实往world中写内容分两种情况:纯文本内容、二进制内容(图片),难点在厚着。主要用到ApplicationClass 、Document操作类,

以下是我上网查询和自己总结的一个WordHelper共同类,里面有相关说明。因时间问题就不多说了,如果写的有不对地方,希望大家指正:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using Microsoft.Office.Interop.Word;
using System.IO;
using System.Data;
using System.Text.RegularExpressions;
using Open.ItemBank.BusinessEntities;
using Open.ItemBank.BusinessLogic;
using Open.Framework;
using System.Web;
namespace Open.ItemBank.WebBase
{
    public class WordHelper
    {
        #region 初始声明和构造函数
        private ApplicationClass WordApp;
        private Document WordDoc;
        private Object oMissing = System.Reflection.Missing.Value;
        private static bool isOpened = false;//判断word模版是否被占用

        public WordHelper()
        {
           //
           // TODO: 在此处添加构造函数逻辑
           //
        }
         #endregion

        #region World对象操作
        public void SaveAs(string strFileName,bool isReplace)
       {
            if (isReplace && File.Exists(strFileName))
            {
                File.Delete(strFileName);
            }
            object missing = Type.Missing;
            object fileName = strFileName;
            WordDoc.SaveAs(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);
        }
        
        /// <summary>
        /// 定义一个Word.Application 对象
        /// </summary>
        public void activeWordApp()
        {
            WordApp = new ApplicationClass();
        }

        /// <summary>
        /// 终止内容
        /// </summary>
        public void Quit()
        {
            object missing = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Word.Application app = WordApp.Application;
            ((_Application)app).Quit(ref missing, ref missing, ref missing);
            isOpened = false;
        }

        /// <summary>
        /// 关闭进程
        /// </summary>
        public void Close()
        {
            ((_Document)WordDoc).Close(ref oMissing, ref oMissing, ref oMissing);
        }

        //基于模版新建Word文件
        public void OpenTempelte(string strTemppath)
        {
            object Missing = Type.Missing;
            activeWordApp();
            WordApp.Visible = false;
            object oTemplate = (object)strTemppath;
            try
            {
                while (isOpened)
                {
                    System.Threading.Thread.Sleep(500);
                }
                WordDoc = WordApp.Documents.Add(ref oTemplate, ref Missing, ref Missing, ref Missing);
                isOpened = true;
                WordDoc.Activate();
            }
            catch (Exception Ex)
            {
                Quit();
                isOpened = false;
                throw new Exception(Ex.Message);
            }
        }

        /// <summary>
        /// 往对应有标签内填充填充内容
        /// </summary>
        /// <param name="LabelId"></param>
        /// <param name="Content"></param>
        public void FillLable(string LabelId,string Content)
        {
            //打开Word模版
            object bkmC = LabelId;
            if (WordApp.ActiveDocument.Bookmarks.Exists(LabelId) == true)
            {
                WordApp.ActiveDocument.Bookmarks.get_Item(ref bkmC).Select();
            }
            WordApp.Selection.TypeText(Content);
        }


        /// <summary>
        /// 往当前行的最后追加内容
        /// </summary>
        /// <param name="LabelId"></param>
        /// <param name="Content"></param>
        public void FillLable(string Content)
        {
            //向对应的标签后追加内容
            WordApp.Selection.TypeText(Content);
        }

        /// <summary>
        /// 换行
        /// </summary>
        /// <param name="currentSelection"></param>
        public void TryParagraph(Selection currentSelection)
        {
            currentSelection.TypeParagraph();//换行
        }
        #endregion

        #region  World位置移动方法
        /// <summary>
        /// 将当前光标定位到当前行的最后一个数字
        /// </summary>
        public void FillSelection()
        {
            Selection currentSelection = WordApp.Selection;
            object a = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);//得到当前行号
            int oldLine = 0;
            while (oldLine != int.Parse(a.ToString()))//一直按右键,直到光标不再往下了为止
            {
                oldLine++;
                moveRight(currentSelection, WordApp);
                a = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);
            }
        }

        /// <summary>
        /// 将光标后移一个数字
        /// </summary>
        private void moveRight(Selection currentSelection, Microsoft.Office.Interop.Word.Application WordApp)
        {
            if (currentSelection == null || currentSelection != WordApp.Selection)
                currentSelection = WordApp.Selection;
            object dummy = System.Reflection.Missing.Value;
            object count = 1;
            object Unit = Microsoft.Office.Interop.Word.WdUnits.wdCharacter;
            currentSelection.MoveRight(ref Unit, ref count, ref dummy);
        }


        /// <summary>
        /// 定位到第一个字符
        /// </summary>
        private void gotoFirstCharacter()
        {
            Selection selection = WordApp.Selection;
            if (selection == null || selection != WordApp.Selection)
                selection = WordApp.Selection;
            int oldLine = 0;
            gotoAbsolutLine(1);
            object a = selection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);//得到当前行号
            while (oldLine != int.Parse(a.ToString()))//一直按右键,直到光标不再往下了为止
            {
                oldLine++;
                moveRight(selection, WordApp);
                a = selection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);
            }
            gotoAbsolutLine(int.Parse(a.ToString()));
        }

        /// <summary>
        /// 根据行号定位到具体行
        /// </summary>
        /// <param name="lineNum"></param>
        private void gotoAbsolutLine(int lineNum)
        {
            Selection selection = WordApp.Selection;
            if(selection == null || selection != WordApp.Selection)
                selection = WordApp.Selection;
            object dummy = System.Reflection.Missing.Value;
            object what = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine;
            object which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst;
            object count = lineNum;
            selection.GoTo(ref what, ref which, ref count, ref dummy);
        }


        /// <summary>
        /// 取得行、列、页信息
        /// </summary>
        /// <param name="row_cout">行</param>
        /// <param name="cell_count">列</param>
        /// <param name="page_count">页</param>
        public void WordGetRCP(ref object row_cout, ref object cell_count, ref object page_count)
        {
            Selection currentSelection = WordApp.Selection;  
            row_cout=currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);      //a.ToString()行
            cell_count=currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterColumnNumber);   //b.ToString()列
            page_count=currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdActiveEndAdjustedPageNumber);  //c.ToString()页
        }

        #endregion

        #region   文件模板创建、下载、删除
        /// <summary>
        /// 根据模板创建文件
        /// </summary>
        /// <returns></returns>
        public string CreateTemplate()
        {
            string mFileTimes = string.Empty;
            try
            {
                string path = System.Web.HttpContext.Current.Server.MapPath("~/Template");
                mFileTimes = string.Format("{0}", Convert.ToDateTime(DateTime.Now).ToString("yyyymmddhhmmss"));
                string templatePath = string.Format("{0}/Template.docx", path);
                string mStrFileRoot = string.Format("{0}/{1}savetest.docx", path, mFileTimes);
                if (File.Exists(mStrFileRoot))
                    DeletTemplate(mStrFileRoot);
                File.Copy(templatePath, mStrFileRoot);
                mFileTimes = string.Format("{0}savetest.docx", mFileTimes);
            }
            catch (Exception)
            {
                throw;
            }
            return mFileTimes;
        }

        /// <summary>
        /// 删除文件
        /// </summary>
        /// <param name="mStrFileRoot"></param>
        public void DeletTemplate(string mStrFileName)
        {
            try
            {
                string path = System.Web.HttpContext.Current.Server.MapPath("~/Template");
                string mStrFileRoot = string.Format("{0}\\{1}", path, mStrFileName);
                if (File.Exists(mStrFileRoot))
                     File.Delete(mStrFileRoot);
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 下载文件
        /// </summary>
        public void LoadPaperTemplate(string mStrFileName)
        {
            FileStream fs = null;
            BinaryReader br = null;
            BinaryWriter brnew = null;
            try
            {
                //给内容赋值   
                string path = System.Web.HttpContext.Current.Server.MapPath("~/Template");
                string mStrFileRoot = string.Format("{0}\\{1}", path, mStrFileName);
                if (File.Exists(mStrFileRoot))
                {
                    fs = new System.IO.FileStream(mStrFileRoot, System.IO.FileMode.Open);
                    br = new BinaryReader((Stream)fs);
                    byte[] bytes = br.ReadBytes((Int32)fs.Length);
                    brnew = new BinaryWriter(fs);
                    brnew.Write(bytes, 0, bytes.Length);
                    System.Web.HttpContext.Current.Response.Clear();
                    System.Web.HttpContext.Current.Response.Buffer = true;
                    System.Web.HttpContext.Current.Response.Charset = "GB2312";
                    System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(mStrFileRoot.Substring(mStrFileRoot.LastIndexOf('\\') + 1)));
                    System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                    System.Web.HttpContext.Current.Response.ContentType = "application/ms-word";
                    System.Web.HttpContext.Current.Response.BinaryWrite(bytes);
                    System.Web.HttpContext.Current.Response.Flush();
                    System.Web.HttpContext.Current.Response.End();
                }
            }
            catch (Exception)
            {
                //throw;
            }
            finally
            {
                br.Close();
                brnew.Close();
                fs.Close();
            }
        }
        #endregion

        #region  扩展操作
        /// <summary>
        ///导出对应试卷完整信息
        /// </summary>
        /// <param name="mStrPaperId">试卷编号</param>
        /// <param name="file">保存文件</param>
        /// <param name="fileTemplate">模板文件</param>
        public void WriteDoc(string mStrPaperId)
        {
            string mStrFileName = string.Empty;   //文件名称
            try
            {
                #region 获取新的模板对象
                mStrFileName = CreateTemplate();
                string fileTemplate = "~/Template/Template.docx";
                string file = string.Format("~/Template/{0}", mStrFileName);
                #endregion

                #region  初始声明文档操作对象
                object strFileName = System.Web.HttpContext.Current.Server.MapPath(file);
                object fileName = System.Web.HttpContext.Current.Server.MapPath(fileTemplate);
                OpenTempelte(fileName.ToString());
                //WordApp.Visible = true; 用于调试显示模板信息
                #endregion

                #region  获取对应模板,并将试题填充到对应文档中
                ///试卷模板中包含一个标签"content" 
                ///"content" 试卷的内容部分 
                ///**获取对应试卷的试题信息
                DraftPaper draftPaper = new DraftPaper();
                draftPaper = (new DraftPaperLogic()).GetById(DataAdpater.ToInt(mStrPaperId));
                foreach (Bookmark bm in WordDoc.Bookmarks)
                {
                    if (bm.Name == "title") //对应写试卷名称
                    {
                        bm.Select();
                        Selection currentSelections = WordApp.Selection;
                        //设置当前行对应的字体样式
                        currentSelections.Range.Font.Name = "新宋体";
                        currentSelections.Range.Font.Bold = 1;
                        currentSelections.Range.Font.Size = 18;
                        currentSelections.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;//设置居中对齐 
                        //@@得到光标的位置
                        currentSelections.TypeText(draftPaper.PaperName);
                        TryParagraph(currentSelections);//换行
                    }
                    if (bm.Name == "content")//获取当前标签对象是否正确
                    {
                        //将光标定位到书签内。 
                        bm.Select();
                        //获取当前光标的位置。 
                        Selection currentSelection = WordApp.Selection;
                        //设置当前行对应的字体样式
                        currentSelection.Range.Font.Name = "新宋体";
                        currentSelection.Range.Font.Bold = 1;
                        currentSelection.Range.Font.Size = 16;
                        currentSelection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft;//设置左对齐 
                        ///**获取该试卷对应大题信息
                        List<DraftPaperSection> draftPaperSectionList = (new DraftPaperSectionLogic()).GetListAllByDraftPaperId(DataAdpater.ToInt(mStrPaperId));
                        foreach (DraftPaperSection DpSection in draftPaperSectionList)
                        {
                            //@@填充对应大题名称
                            currentSelection.TypeText(string.Format("{0} {1}", DpSection.SectionIndex, DpSection.Title));
                            currentSelection.TypeParagraph();//换行
                            ///**获取该试卷对应大题下的所有试题关系集合
                            List<DraftPaperQuestionRef> draftPaperQuestionRefList = (new DraftPaperQuestionRefLogic()).GetAllDraftPaperQuestionRefById(DpSection.DraftPaperSectionId, DpSection.DraftPaperId);
                            DraftQuestion _dQ = null;
                            foreach (DraftPaperQuestionRef DPQRef in draftPaperQuestionRefList)
                            {
                                ///** 获取该试卷对应的试题
                                _dQ = (new DraftQuestionLogic()).GetById(DPQRef.DraftItemId);
                                if (_dQ != null)
                                {
                                    //@@填充对应试题名称
                                    currentSelection.TypeText(DPQRef.ItemIndex.ToString()+"、");
                                    //TryParagraph(currentSelection);//换行
                                    ///** 获取该试题内容信息
                                    DraftQuestionContent draftQuestionContent = (new DraftQuestionContentLogic()).GetById(_dQ.DraftQuestionId, _dQ.VersionId);
                                    string questionContentText = string.Empty;
                                    List<string> questionImages = null;
                                    (new DraftQuestionLogic()).ContentImageAnalysis(draftQuestionContent, out questionContentText, out questionImages);
                                    int materialPoint = 0;  //用于记录材料中图片所占的个数
                                    int index = 0;         //用于取出对应材料图片信息的索引
                                    //获取对应的内容和材料数组
                                    string[] mStrDraftQuestionContens = questionContentText.Split('□');
                                    //判断是否含有阅读材料信息
                                    if (mStrDraftQuestionContens != null && !string.IsNullOrEmpty(mStrDraftQuestionContens[0]))
                                    {
                                        WriteDocImages(mStrDraftQuestionContens[0], currentSelection, questionImages, index, out materialPoint, WordDoc);
                                        TryParagraph(currentSelection);//换行
                                    }
                                    index = materialPoint;  //重新将材料信息赋值
                                    //填充对应试题内容信息
                                    if (mStrDraftQuestionContens != null && !string.IsNullOrEmpty(mStrDraftQuestionContens[1]))
                                    {
                                        WriteDocImages(mStrDraftQuestionContens[1], currentSelection, questionImages, index, out materialPoint, WordDoc);
                                        TryParagraph(currentSelection);//换行
                                    }
                                }
                            }
                        }
                    }
                }
                #endregion

                #region 将Word文档保存并结束进程
                SaveAs(strFileName.ToString(), false);
                Close();
                Quit();
                #endregion

                #region 下载文件内容信息
                LoadPaperTemplate(mStrFileName);
                #endregion
            }
            catch (Exception)
            {
                throw;
                #region 结束进程
                Close();
                Quit();
                #endregion
            }
            finally
            {
                #region 删除文件内容信息
                DeletTemplate(mStrFileName);
                #endregion
            }
        }

        /// <summary>
        /// 获取填充对应图片信息
        /// </summary>
        /// <param name="mStrDraftQuestionContens">对应填充试题内容信息</param>
        /// <param name="currentSelection">文本插入对象</param>
        /// <param name="questionImages">图片集合信息</param>
        /// <param name="index">取图片的初始索引</param>
        /// <param name="materialPoint"></param>
        public void WriteDocImages(string mStrDraftQuestionContens, Selection currentSelection, List<string> questionImages, int index, out int materialPoint, Document WordDoc)
        {
            materialPoint = 0;//初始给材料赋值
            if (!mStrDraftQuestionContens.Contains('■'))
            {
                //@@填充对应试题的材料信息
                mStrDraftQuestionContens = mStrDraftQuestionContens.Replace("\\r", "");
                mStrDraftQuestionContens = mStrDraftQuestionContens.Replace("\\n", "");
                currentSelection.TypeText(mStrDraftQuestionContens);
            }
            else
            {
                string[] mStrDQMaterial = mStrDraftQuestionContens.Split('■');
                materialPoint = mStrDQMaterial.Length - 1;//得到内容的图片索引开始位置
                foreach (string mStrMaterial in mStrDQMaterial)
                {
                    ///** 写对应试题材料信息
                    currentSelection.TypeText(mStrMaterial);
                    if (materialPoint > 0)
                    {
                        Regex reg  =new Regex(@"(?i)<IMG[^>]*?\ssrc\s*=\s*(['""]?)(?<src>[^'""\s>]+)\1[^>]*>");
                        string mStrImgMaterial = string.Empty; //过滤后的图片信息
                        MatchCollection mc = reg.Matches(questionImages[index]);
                        foreach (Match m in mc)
                        {
                            mStrImgMaterial=m.Groups["src"].Value ;
                            break;
                        }
                        string FileName = System.Web.HttpContext.Current.Server.MapPath(mStrImgMaterial.Contains("..") ? ("~" + mStrImgMaterial.Substring(2)) : ("~" + mStrImgMaterial));//图片所在路径 

                        //object LinkToFile = false;
                        //object SaveWithDocument = true;
                        //object Anchor = WordDoc.Application.Selection.Range;
                        //InlineShape li = currentSelection.InlineShapes.AddPicture(imgPath, ref LinkToFile, ref SaveWithDocument, ref Anchor);
                        //li.Width = 20f;//图片宽度
                        //li.Height = 20f;//图片高度
                        //Shape s = li.ConvertToShape();
                        //插入图片
                        if (File.Exists(FileName))
                        {
                            //string FileName = System.Web.HttpContext.Current.Server.MapPath("~/Attachments/DraftQuestionContent/20120308102235.jpg");//图片所在路径
                            object LinkToFile = false;
                            object SaveWithDocument = true;
                            object Anchor = WordDoc.Application.Selection.Range;
                            WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
                            //WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 40f;//图片宽度
                            //WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 40f;//图片高度
                        }
                        FillSelection();
                        //将图片设置为四周环绕型
                        //Microsoft.Office.Interop.Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();
                        //s.WrapFormat.Type = Microsoft.Office.Interop.Word.WdWrapType.wdWrapSquare;
                        //WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度 
                        //将图片设置为四周环绕型 
                        materialPoint--;
                    }
                    index++;
                }
            }
        }

        /// <summary>
        /// 参考操作
        /// </summary>
        /// <returns></returns>
        public string CreateWordFile()
        {
            string message = "";
            try
            {
                Object oMissing = System.Reflection.Missing.Value;
                string dir = System.Web.HttpContext.Current.Server.MapPath("");//首先在类库添加using System.web的引用
                if (!Directory.Exists(dir + "\\file"))
                {
                    Directory.CreateDirectory(dir + "\\file");  //创建文件所在目录
                }
                string name = DateTime.Now.ToLongDateString() + ".doc";
                object filename = dir + "\\file\\" + name;  //文件保存路径

                //创建Word文档
                Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
                Microsoft.Office.Interop.Word.Document WordDoc = WordApp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
                WordApp.Visible = true;
                object unit;
                object count; //移动数
                unit = Microsoft.Office.Interop.Word.WdUnits.wdCell;
                Selection currentSelection = WordApp.Selection;
                count = 1;
                currentSelection.TypeText("11111:");
                //object c = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdActiveEndAdjustedPageNumber);
                WordApp.Selection.Move(ref unit, ref count);
                //插入图片
                if (File.Exists(System.Web.HttpContext.Current.Server.MapPath("~/Attachments/DraftQuestionContent/20120308102235.jpg")))
                {
                    string FileName = System.Web.HttpContext.Current.Server.MapPath("~/Attachments/DraftQuestionContent/20120308102235.jpg");//图片所在路径
                    object LinkToFile = false;
                    object SaveWithDocument = true;
                    object Anchor = currentSelection.Range;
                    WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
                }

                object a = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);//得到当前行号
                int oldLine = 0;
                while (oldLine != int.Parse(a.ToString()))//一直按右键,直到光标不再往下了为止
                {
                    oldLine++;
                    moveRight(currentSelection, WordApp);
                    a = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);
                }


                //将图片设置为四周环绕型
                // Microsoft.Office.Interop.Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();
                // s.WrapFormat.Type = Microsoft.Office.Interop.Word.WdWrapType.wdWrapInline;
                WordApp.Selection.Move(ref unit, ref count);
                currentSelection.TypeText("yangzhichaojiuasdfasdkf;ajsldkjfa;lskdjfa;sdkjfa;sdkfalsdfka;sldfkjasldkfja;sldkfjshiwojiu");
                //插入图片
                if (File.Exists(System.Web.HttpContext.Current.Server.MapPath("~/Attachments/DraftQuestionContent/20120308102235.jpg")))
                {
                    string FileName = System.Web.HttpContext.Current.Server.MapPath("~/Attachments/DraftQuestionContent/20120308102235.jpg");//图片所在路径
                    object LinkToFile = false;
                    object SaveWithDocument = true;
                    object Anchor = currentSelection.Range;
                    WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
                }
                oldLine = 0;
                a = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);//得到当前行号
                while (oldLine != int.Parse(a.ToString()))//一直按右键,直到光标不再往下了为止
                {
                    oldLine++;
                    moveRight(currentSelection, WordApp);
                    a = currentSelection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdFirstCharacterLineNumber);
                }

                //文件保存
                WordDoc.SaveAs(ref filename, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
                WordDoc.Close(ref oMissing, ref oMissing, ref oMissing);
                WordApp.Quit(ref oMissing, ref oMissing, ref oMissing);
                message = name + "文档生成成功";
            }
            catch
            {
            }
            return message;
        }
       #endregion
   }
}

  

           有不明白地方可以给我留言,我会及时给大家回复,希望对大家有所帮助!!!

posted on 2012-06-28 09:47  朝扬  阅读(965)  评论(0编辑  收藏  举报