最近在做一个项目,需要利用Word做为打印模板,不过客户给出的报表样式中有些数据是竖排输出的,但大部分的文档示例中,对此均未提及。经过摸索发现竖排文字,其实与横排文字的控制输出是一致的,只需做设置即可。实现步骤如下: 1.创建打印模板文件(*.dot) 此为关键步骤,在需要竖排的地方,先文字的字体、样式设置后,然后设置文字方向,再选择该段文字,为其插入一个书签(BookMark),并为该书签命名。 2.利用C#打开,替换该书签即可,代码如下: 注意使用以下代码时,需要引入Word库 Word.ApplicationClass App = null; //Word应用程序对象 Word.Document doc = null; //Word文档对象 object missing = System.Reflection.Missing.Value; object miss=Type.Missing; if (App==null) App = new Word.ApplicationClass();//创建word对象 App.Visible = false; //设置word不可见 //根据模板创建新文档,不过这个模板文件的名称放置在app.config文件中 object oTemplate = ConfigurationSettings.AppSettings["TemplateOfLetter"];//获取文件名 doc = App.Documents.Add(ref oTemplate, ref missing,ref missing, ref missing);//创建新文档 doc.Activate();//激活文档 Object objBookMark = "姓名";//姓 名 创建书签对象 string name="张三"; doc.Bookmarks.get_Item(ref objBookMark).Range.Text =name;//替换该书签,可为任意值了 //打印输出 doc.PrintOut( 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,ref missing,ref missing,ref missing); //关闭新创建的文档 object SaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;//创建关闭选项 if (doc!=null) doc.Close( ref SaveChanges, ref missing, ref missing); //退出Word if (App!=null) App.Application.Quit(ref miss, ref miss, ref miss); App=null; doc = null; 3.注意事项 a)在控制Word时,应注意释放已占用的word对象,所以上述代码最好写在try/catch/finally中,把资源释放代码写在finally中 b)如果在word中用多个文字需要竖排,最好使用表格或文本框对象,强烈建议使用文本框对象来放置竖排文本,这样不会影响页面设置,而单纯的竖排文字方向会导致整个页面全部文字变成竖排,不利用其他文本的放置 c)如果需要一次性生成多个文档并打印输出的话,可以考虑使用多线程技术,并利用进度栏进行进度显示,该部分内容不在本主题的讨论范围。 d)关于效率问题,操作word进行文档输出,其效率并不算高,但好在word的使用范围广,不需要在客户的机器上另行安装其他报表工具,且用户有能力对报表模板进行样式及不涉及数据输出等小范围的页面调整,并且用户较为熟悉,打印控制也较为方便,如果不是对效率有太高的要求,使用Word做为打印模板是比较合适,自已的程序的测试数据,生成3879个文件并打印输出,用时3223秒,基本上是0.9秒生成并输出一个,考虑到打印机的速度(目前打印机,能达到30张/s的都算是很快的了),这样的效率是完全可以接受的。 |
|