C#动态向Word模板插入表格

        这几天写程序时遇到一个问题,就是需要将程序收集到用户输入的内容使用文档形式保存下来并且在网络中进行传输,一开始使用的是PDF文档,因为他一旦编辑,几乎不可修改。这就保证信息的完整性和正确性。

  最初使用的是itexSharp进行写入,但是随着用户输入数据量的增大发现问题,那就是需要写大量的代码来控制写入文本的格式和字体等信息,通过创建模板方式代码也不太好写,而且一旦数据量较大的话造成最终产生的xx.pdf文件也是较大,也不利于在网络中进行传输,同时其灵活性较差,如果要去生成文档的版式发生改变就需要重新写代码来改变文档的布局。

  最后决定使用Word文档进行编辑,虽然Word文档的安全性不如pdf但是因为整个文件的传输过程中使用的是内网,因此也没有多大的问题。而且使用Word模板操作,其灵活性更好,假设在传入参数不变情况下,需要改变最终生成Word版式时只需要修改Word模板即可,而不需要重新写代码。

  废话不多说,看代码,下面这个Report类是从网上找到的一个Word模板操作类,更改命名空间后即可直接使用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Word;

namespace 公共方法
{
    public class Report
    {
        private _Application wordApp = null;
        private _Document wordDoc = null;
        public _Application Application
        {
            get
            {
                return wordApp;
            }
            set
            {
                wordApp = value;
            }
        }
        public _Document Document
        {
            get
            {
                return wordDoc;
            }
            set
            {
                wordDoc = value;
            }
        }

        //通过模板创建新文档
        public void CreateNewDocument(string filePath)
        {
            killWinWordProcess();
            wordApp = new ApplicationClass();
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            wordApp.Visible = false;
            object missing = System.Reflection.Missing.Value;
            object templateName = filePath;
            wordDoc = wordApp.Documents.Open(ref templateName, 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);
        }

        //保存新文件
        public void SaveDocument(string filePath)
        {
            object fileName = filePath;
            object format = WdSaveFormat.wdFormatDocument;//保存格式
            object miss = System.Reflection.Missing.Value;
            wordDoc.SaveAs(ref fileName, ref format, ref miss,
                ref miss, ref miss, ref miss, ref miss,
                ref miss, ref miss, ref miss, ref miss,
                ref miss, ref miss, ref miss, ref miss,
                ref miss);
            //关闭wordDoc,wordApp对象
            object SaveChanges = WdSaveOptions.wdSaveChanges;
            object OriginalFormat = WdOriginalFormat.wdOriginalDocumentFormat;
            object RouteDocument = false;
            wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument);
            wordApp.Quit(ref SaveChanges, ref OriginalFormat, ref RouteDocument);
        }
<span style="white-space:pre">	//插入表格,bookmark书签
        public Table InsertTable(string bookmark, int rows, int columns, float width)
        {
            object miss = System.Reflection.Missing.Value;
            object oStart = bookmark;
            Range range = wordDoc.Bookmarks.get_Item(ref oStart).Range;//表格插入位置
            Table newTable = wordDoc.Tables.Add(range, rows, columns, ref miss, ref miss);
            //设置表的格式
            newTable.Borders.Enable = 1;  //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)
            newTable.Borders.OutsideLineWidth = WdLineWidth.wdLineWidth050pt;//边框宽度
            if (width != 0)
            {
                newTable.PreferredWidth = width;//表格宽度
            }
            newTable.AllowPageBreaks = false;
            return newTable;
        }</span>
        //设置表格内容对齐方式 Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1)
        public void SetParagraph_Table(Word.Table table, int Align, int Vertical)
        {
            switch (Align)
            {
                case -1: table.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft; break;//左对齐
                case 0: table.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; break;//水平居中
                case 1: table.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight; break;//右对齐
            }
            switch (Vertical)
            {
                case -1: table.Range.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalTop; break;//顶端对齐
                case 0: table.Range.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter; break;//垂直居中
                case 1: table.Range.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalBottom; break;//底端对齐
            }
        }

        //设置表格字体
        public void SetFont_Table(Word.Table table, string fontName, double size)
        {
            if (size != 0)
            {
                table.Range.Font.Size = Convert.ToSingle(size);
            }
            if (fontName != "")
            {
                table.Range.Font.Name = fontName;
            }
        }

        //是否使用边框,n表格的序号,use是或否
        public void UseBorder(int n, bool use)
        {
            if (use)
            {
                wordDoc.Content.Tables[n].Borders.Enable = 1;  //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)
            }
            else
            {
                wordDoc.Content.Tables[n].Borders.Enable = 2;  //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)
            }
        }

        //给表格插入一行,n表格的序号从1开始记
        public void AddRow(int n)
        {
            object miss = System.Reflection.Missing.Value;
            wordDoc.Content.Tables[n].Rows.Add(ref miss);
        }

        //给表格添加一行
        public void AddRow(Word.Table table)
        {
            object miss = System.Reflection.Missing.Value;
            table.Rows.Add(ref miss);
        }

        //给表格插入rows行,n为表格的序号
        public void AddRow(int n, int rows)
        {
            object miss = System.Reflection.Missing.Value;
            Word.Table table = wordDoc.Content.Tables[n];
            for (int i = 0; i < rows; i++)
            {
                table.Rows.Add(ref miss);
            }
        }

        //给表格中单元格插入元素,table所在表格,row行号,column列号,value插入的元素
        public void InsertCell(Word.Table table, int row, int column, string value)
        {
            table.Cell(row, column).Range.Text = value;
        }

        //给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素
        public void InsertCell(int n, int row, int column, string value)
        {
            wordDoc.Content.Tables[n].Cell(row, column).Range.Text = value;
        }

        //给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值
        public void InsertCell(int n, int row, int columns, string[] values)
        {
            Word.Table table = wordDoc.Content.Tables[n];
            for (int i = 0; i < columns; i++)
            {
                table.Cell(row, i + 1).Range.Text = values[i];
            }
        }

    }

}

在使用这个类的时候需要添加COM引用MicroSoft Word 11.0 Object Library,因为我用的是Office 2003所以导入就是11.0,根据自己电脑上的Office版本选择导入的版本即可,这时候还需要修改导入动态库的互操作类型改为false,否则也是会报错的。

这个类在使用的时候,只能当做一个中间类,具体操作Word模板的方法可以再根据模板的不同,调用这个类中的相应的方法对模板进行修改,这就很好的保证了代码的复用性,从而避免了大量重复的代码重写。

同时这个类在对表格进行操作时可以动态获取模板中的表格对象,例如在对某个表格插入一行时可以调用 AddRow(int n)方法,这个方法中int类型数据n代表了模板中的第几个表格n的值从1开始。

在程序中需要根据数据量的不同动态插入表格,可以先将表格的表头插入模板中然后由数据数量确定插入表格的行数和列数,然后向这些单元格中插入数据。

例如:有一个list对象,动态插入一个有9列的表格中,表格的行数由list元素数量确定。具体代码如下:

<span style="white-space:pre">	</span>int row = list.Count%9>0?list.Count/9+1:list.Count/9;
            for (int i = 3; i < row+3; i++)
            {
                report.AddRow(4);
                for (int j = 1; j <= 9; j++)
                {
                    if (k < list.Count)
                    {
                        report.InsertCell(4, i, j, list[k].ToString());
                        k++;
                    }
                }
            }
这段代码中i的初始值之所以是3是因为我要从那个表格的第三行进行插入数据,AddRow(4)是代表向第四个表格中插入行。

InsertCell是向单元格中插入数据的方法,该方法的第一个参数4代表向第四个单元格插入数据,i,j分别代表单元格的行号和列号,他们的值都是从1开始。这段代码就完成了向模板中动态插入表格,并且向表格中插入相应的数据。

同时这个方法还有创建表格的方法,这个方法返回的值是一个Table对象,在后面的插入行,向表格中插入值得方法中他也可以作为参数进行传递,同样能达到动态向表格插入行和数据的方法。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值