关于aspose.word的一些用法

最近的工作要用到一个要money的组件,aspose.word,通过这个可以把html页面直接生成word文档。当然,也有aspose.pdf等组件,对应的就是生成pdf格式的文件等。下面说说该组件运用过程中的一些问题。

首先,贴一段代码出来:

private void button1_Click(object sender, EventArgs e)
        {
            string tpath = "resume.docx";
            Document doc = new Document(tpath);

            DocumentBuilder mybuilder = new DocumentBuilder(doc);

            //通过书签的形式向word模板中插入内容;
            doc.Range.Bookmarks["resume_name"].Text = "我的简历";
            doc.Range.Bookmarks["resume_id"].Text = "123456789987654321";
            doc.Range.Bookmarks["update_time"].Text = "2022年12月22日";
            doc.Range.Bookmarks["apply_state"].Text = "我正在主动找工作,可快速到岗";

            //直接向word模板中插入html代码,生成的word会自动编译。
            mybuilder.MoveToCell(0, 0, 0, 0);
            mybuilder.InsertHtml("<font style='margin-top:20px;color:#bc4308;font-weight:bold;'>个人信息:</font><hr style='border-style:double;color:#bc4308;'/>");

            //四个数字对应的是:第一张表,第一行,第一列,第一个字符之后。
            mybuilder.MoveToCell(0, 1, 0, 0);
            mybuilder.InsertHtml("<table><tr><td style='width:63pt;'>姓名:</td><td colspan='2'>李婷</td></tr><tr><td style='width:63pt;'>性别:</td><td colspan='2'>女</td></tr><tr><td style='width:63pt;'>学历:</td><td colspan='2'>本科</td></tr><tr><td style='width:63pt;'>现居地:</td><td colspan='2'>郑州市</td></tr><tr><td style='width:63pt;'>出生日期:</td><td colspan='2'>2010年12月20日</td></tr><tr><td rowspan='3' style='vertical-align:top;'>联系方式:</td><td style='width:74pt;'>手机:</td><td style='width:173pt;'>15603900833</td></tr><tr><td style='width:74pt;'>家庭电话:</td><td style='width:173pt;'>0371-6027889</td></tr><tr><td style='width:74pt;'>办公室电话:</td><td style='width:173pt;'>0371-62014547</td></tr></table>");

            //插入图片
            Shape shape = new Shape(doc, ShapeType.Image);
            shape.ImageData.SetImage("ziji.jpg");
            shape.Width = 100;
            shape.Height = 110;
            shape.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;//图片向右对齐

            mybuilder.MoveToCell(0, 1, 1, 0);
            mybuilder.InsertNode(shape);

            //读文件
            string s;
            FileStream fs = new FileStream("1.html", FileMode.Open);

            StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
            s = sr.ReadToEnd();
            sr.Close();
            fs.Close();

            mybuilder.MoveToCell(0, 2, 0, 0);
            mybuilder.InsertHtml(s);//直接把文件流插入到word模板中


            //插入页尾
            mybuilder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);

            Border topBorder = mybuilder.CellFormat.Borders[BorderType.Top];
            topBorder.LineStyle = LineStyle.Single;
            topBorder.LineWidth = 1;

            mybuilder.InsertCell();
            mybuilder.CellFormat.Width = 3 * 144;
            mybuilder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
            mybuilder.Write("公司名称");

            mybuilder.InsertCell();
            mybuilder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
            mybuilder.Write("日期");

            mybuilder.EndRow();
            mybuilder.EndTable();

 

            //保存在test.doc文档中。
            doc.Save("test.doc", SaveFormat.Doc);
            MessageBox.Show("已经完成!");
        }

使用该组件的流程是:先做一个word模板,模板里面包含表格。然后在代码中通过四个数值的定位在特定的表格里插入内容。

分为三种方式向word模板中插入内容。

一:通过在word模板中对应设置书签,重命名书签名称,在代码中根据书签名称,在特定位置插入特定内容;

二:插入图片有两种方式:(1)

            //插入图片
            Shape shape = new Shape(doc, ShapeType.Image);
            shape.ImageData.SetImage("ziji.jpg");
            shape.Width = 100;
            shape.Height = 110;
            shape.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;//图片向右对齐

            mybuilder.MoveToCell(0, 1, 1, 0);
            mybuilder.InsertNode(shape);

这种方式插入图片时,必须在word模板中做表格,定位表格位置,在特定位置插入图。

最主要的是,图片必须在项目文件夹中。

(2)通过插入一段html代码。本来,我们以为直接插入html代码,而项目中没有图片时,在断网的情况下,图片不能够正常显示。后来实践证明,采用直接插入html代码的方式插入图片的方式下:在断网的情况下,图片是可以正常显示的。

但是,这种方式的问题是:原图有多大,生成的word中的图片就有多大。不管html页面的图片大小,而是原图的大小。

三:定位之后,直接插入html代码。比如:

            mybuilder.MoveToCell(0, 1, 0, 0);
            mybuilder.InsertHtml("<table><tr><td style='width:63pt;'>姓名:</td><td colspan='2'>李婷</td></tr><tr><td style='width:63pt;'>性别:</td><td colspan='2'>女</td></tr><tr><td style='width:63pt;'>学历:</td><td colspan='2'>本科</td></tr><tr><td style='width:63pt;'>现居地:</td><td colspan='2'>郑州市</td></tr><tr><td style='width:63pt;'>出生日期:</td><td colspan='2'>2010年12月20日</td></tr><tr><td rowspan='3' style='vertical-align:top;'>联系方式:</td><td style='width:74pt;'>手机:</td><td style='width:173pt;'>15603900833</td></tr><tr><td style='width:74pt;'>家庭电话:</td><td style='width:173pt;'>0371-6027889</td></tr><tr><td style='width:74pt;'>办公室电话:</td><td style='width:173pt;'>0371-62014547</td></tr></table>");

这种方式时,需要注意的是,很多html中的标签是不能够如愿地转换成对应的word内容的。通过实践发现:

(1)hr的样式在word中是不管用的。注意是hr的样式,而不是hr。

(2)br在word中不管用。

(3)div的border,在word中是不显示的,但是它要占一个位置。

(4)p在word中只能显示表示一行的效果,至于颜色或者大小之类的效果,必须用font标签才能够显示。

(5)最重要的一点是:如果想直接把html转换成word,要注意宽度等的设置,此时,就需要一个能够同时在html和word中都管用的单位。因此,唯一的选择是pt——磅值。而且,根据我这几天的实践,在word文档中,选用五号字的情况下,一行有39个字。而对应的关系式是:五号=10.5磅=14px=0.37cm,因此,一行的宽度是410pt。设计html时,就直接用pt来控制宽度。可能刚开始时的宽度不是想象中的样子,这个时候不要急,把所有的设置都按照计算写对了,然后刷新页面,就会给你一个惊喜,完全会是自己要的效果的。

还有一点很重要的要特别指出的是:我们在设计html页面时,习惯性地只要设置每一列的第一个单元格的宽度,这一列下面的单元格就会自动采用这个宽度。但是,在采用aspose.word生成word时,这种方式生成的word中的大文本内容会不能够完全显示,显示的效果是:文字好像浮在word页面之上一样,如果你把光标放在能看到的某一行的最后一个字符之前一个字符一个字符地往后移动光标,你就会发现文字藏在一个你根本无法找到的地方了。这个时候不要急,解决办法是,给每个单元格都加上宽度。而且,必须采用这种方式:<td style='width:74pt;'>,而不要为了偷懒写成这样的方式:<td width='74pt'>。后一种方式是不能解决上面的问题的。如果,你生成的word大文本不能够正常显示,就仔细检查你的html设计中,是不是少了一个<td style='width:74pt;'>,或者写的方式不对。

 

以上总结完毕。如有新发现,及时更新。嘿嘿。

 

下面写一点,这几天工作中遇见的问题。

(1)文件的读写操作:

读操作: string s;
            FileStream fs = new FileStream("路径", FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            s= sr.ReadToEnd();
            sr.Close();
            fs.Close();

文件内容已经保存在s中了。

写操作:FileStream fss=new FileStream("路径",FileMode.Create)
            StreamWriter sw=new StreamWriter(fss);
            sw.Write("内容");
            sw.Close();
            fss.Close();

在此,感谢小飞飞,给我写的这么清晰完整的代码。哈哈。谢谢小飞飞同学了哈。

但是,在我的实际操作中遇见的问题是:读出来的是乱码,因此,必须设置编码格式。因此,需要用到的代码是:

StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);

在这里,我本来选择是的是UTF8,后来证明UTF8读出来的就是乱码,因此,采用default的参数。

在此,感谢凤凰同学。嘿嘿。

(2)关于table表格的合并拆分之类的html设计:我以前没有写过复杂的table,遇到复杂一点的就用多个table拆分了。终于,趁着这次工作的机会,把table中的一些写法也弄懂了。嘿嘿。其实,超级简单。我就是大懒汉啊。哈哈。

                         <table>
                                <tr>
                                    <td style='width:63pt;'>姓名:</td>
                                    <td colspan='2'>李婷</td>
                                </tr>
                                <tr>
                                    <td style='width:63pt;'>性别:</td>
                                    <td colspan='2'>女</td>
                                </tr>
                                <tr>
                                    <td style='width:63pt;'>学历:</td>
                                    <td colspan='2'>本科</td>
                                </tr>
                                <tr>
                                    <td style='width:63pt;'>现居地:</td>
                                    <td colspan='2'>郑州市</td>
                                </tr>
                                <tr>
                                    <td style='width:63pt;'>出生日期:</td>
                                    <td colspan='2'>2010年12月20日</td>
                                </tr>
                                <tr>
                                    <td rowspan='3' style='vertical-align:top;'>联系方式:</td>
                                    <td style='width:74pt;'>手机:</td>
                                    <td style='width:173pt;'>15603900833</td>
                                </tr>
                                <tr>
                                    <td style='width:74pt;'>家庭电话:</td>
                                    <td style='width:173pt;'>0371-6027889</td>
                                </tr>
                                <tr>
                                    <td style='width:74pt;'>办公室电话:</td>
                                    <td style='width:173pt;'>0371-62014547</td>
                                </tr>
                            </table>

colspan='2';是合并列;

rowspan='3';是合并行;

style='vertical-align:top;'   这个是让文本内容从单元格的最上面开始显示;

(3)关于word的一些用法:本次工作中,需要在word中插入书签。可是,我找了好久都没有找到,在网上搜到的解答过于简单,或者是我自己太笨吧。嘿嘿。废话少说,word07中,最左上角word图标——word选项——自定义——在“从下列位置选择命令”中选择“开发工具选项卡”——旧式工具,把旧式工具添加到自定义快速访问工具栏即可。然后,在word的最上面,就可以看到这个图标了:,然后,单击那个工具箱的图标,就能看到这样的效果了:,然后,选择这个就可以添加书签了。嘿嘿。

在此,感谢login同学。嘿嘿。

另:通过实践发现,在使用书签向word模板中插入内容时,书签的最大长度设置是没作用滴。嘿嘿。

posted @ 2014-04-20 11:53  冰封的心  阅读(6205)  评论(0编辑  收藏  举报