C#实现读取多条数据记录并导出到Word

 更新时间:2024年03月18日 08:22:28   作者:初九之潜龙勿用  
这篇文章主要为大家详细介绍了C#如何实现读取多条数据记录并导出到Word,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

应用需求

将数据库数据表中的数据输出并打印,WORD 是一个良好的载体, 在应用项目里,许多情况下我们会使用数据记录结合 WORD 标签模板进行配合,输出数据进行打印的功能需求。

实现步骤

1、设计WORD模板,在需要输出值的地方设置 自定义关键字+字段名(如%%_name),其中%%_为自定义关键字,name为输出字段名。

2、根据条件查询数据表,生成 DataSet ,如果有数据则取 Tables[0]里的数据记录。

3、拷贝 WORD 全部内容到剪贴板做模板数据。

4、遍历数据表记录,粘贴剪贴板内容, 按照自定义关键+列名称,在 WORD 中按关键字查找,并替换成对应的实际数据,完成输出。

举例我们需要提取人员的基本信息生成准考证并打印如下图:

根据以上的结果输出,我们需要设置如下图标签模板:

如图我们准备SQL语句如:select ProjectName,Name,Sex,IdCard,EACode,Position,Time,Address from infos where ... 并生成数据表。

其中 “ key_” 则为自定义关键字,后缀则对应查询输出字段名。

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016

数据库:Microsoft SQL Server 2016

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

配置Office DCOM

配置方法可参照我的文章《C# 读取Word表格到DataSet》进行处理和配置。

实现代码

组件库引入

核心代码

public string DataTableToWord(string _filename,string _repeatKey,object _dataset),该方法提供3个参数,WORD模板文件名、自定义关键字、System.Data.DataSet。

public void DataTableToWord(string _filename,string _repeatKey,object _dataset)
        {
            Object Nothing = System.Reflection.Missing.Value;
            object filename = _filename;
            //创建一个名为WordApp的组件对象
            Word.Application WordApp = new Word.Application();
            //创建一个名为WordDoc的文档对象
            WordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
 
            Word.Document WordDoc = WordApp.Documents.Open(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
 
            WordDoc.SpellingChecked = false;//关闭拼写检查
 
            WordDoc.ShowSpellingErrors = false;//关闭显示拼写错误提示框
 
                WordApp.Selection.WholeStory();
                WordApp.Selection.Cut();
                 DataSet ds=(DataSet)_dataset;
                System.Data.DataTable  dt=ds.Tables[0];
                for(int i=0;i<dt.Rows.Count;i++)
                {
                    WordApp.Selection.Paste();
                    for(int j=0;j<dt.Columns.Count;j++)
                    {
                        
                        string _repKey=_repeatKey+dt.Columns[j].ColumnName.ToString();
                        string _repValue=string.Format("{0}",dt.Rows[i][j].ToString());
 
                        bool isPhoto=false;
                        if(dt.Columns[j].DataType==typeof(System.Byte[]))
                        {
                            isPhoto=true;
                            _repValue="";
                        }
 
 
                        
                        WordApp.Options.ReplaceSelection=true;
                        Word.Find fnd = WordApp.Selection.Find;
                        fnd.ClearFormatting();
 
                        Object findText = _repKey;
                        Object matchCase = false;
                        Object matchWholeWord = Type.Missing;
                        Object matchWildcards = false;
                        Object matchSoundsLike = false;
                        Object matchAllWordForms = false;
                        Object forward = true;
                        Object wrap =Word.WdFindWrap.wdFindContinue;
                        Object format = false;
                        Object replaceWith ="";
                        Object replace =Type.Missing;;
                        Object matchKashida = Type.Missing;
                        Object matchDiacritics = Type.Missing;
                        Object matchAlefHamza = Type.Missing;
                        Object matchControl = Type.Missing;
 
                        
                        
                        while(fnd.Execute(ref findText, ref matchCase, ref matchWholeWord,ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms, 
                            ref forward, ref wrap, ref format, ref replaceWith,ref replace, ref matchKashida, ref matchDiacritics,ref matchAlefHamza, ref matchControl))
                        {
 
                            string r_f=WordApp.Selection.Font.Name.ToString();
                            
                                
                            WordApp.Selection.Range.Text=_repValue;
                            if(isPhoto==true)
                            {
                                string _jpgfile=_path+System.Guid.NewGuid()+".jpg";
                                if (dt.Rows[i][j] == System.DBNull.Value)
                                {
                                    continue;
                                }
                                byte[] filedata = (byte[])dt.Rows[i][j];
                                System.IO.MemoryStream ms = new MemoryStream(filedata);
                                System.Drawing.Image img1 = System.Drawing.Image.FromStream(ms);
                                img1.Save(@_jpgfile);
                                ms.Close();
                                object m1=Type.Missing;
                                object m2=Type.Missing;
                                object m3=Type.Missing;
                                
                                Word.InlineShape pic= WordApp.Selection.InlineShapes.AddPicture(@_jpgfile,ref m1,ref m2,ref m3);
                                int def_width=240;
                                int def_height=320;
                                foreach(Word.Bookmark bm in  WordApp.ActiveDocument.Bookmarks)
                                {
                                    string _findkey=_repKey+"_";
                                    int _f1=bm.Name.IndexOf(_findkey);
                                    if(_f1==0 && bm.Name.Length>(_findkey.Length))
                                    {
                                        string[] _paras=bm.Name.Substring(_findkey.Length,bm.Name.Length-_findkey.Length).Split('_');
                                        if(_paras.GetLength(0)>1){
                                            def_width=int.Parse(_paras[0]);    
                                            def_height=int.Parse(_paras[1]);    
                                        }
                                    }
                                }
                                pic.Width=def_width;
                                pic.Height=def_height;
//                                _repValue=string.Format("{0},{1},{2},{3},{4}",_p1,_p2,_p3,def_width,def_height);
                                File.Delete(@_jpgfile);
                            }
                    
                        }
                    }
                    
                    object dummy = System.Reflection.Missing.Value;
                    object what = Word.WdGoToItem.wdGoToLine;
                    object which = Word.WdGoToDirection.wdGoToLast;
                    object count = System.Reflection.Missing.Value;
//                    WordApp.Selection.GoTo(ref oGoToItem, ref oGoToLast, ref Nothing, ref Nothing);
                    WordApp.Selection.GoTo(ref what, ref which, ref count, ref dummy);
                    //default 表示每行记录之间插入分页符,最后一行时不再插入分页符,以免造成多余一空白页
                    if(i!=dt.Rows.Count-1)
                        {
                            object ib = Word.WdBreakType.wdPageBreak; 
                            WordApp.Selection.InsertBreak(ref ib);
                        }
                    }
    
             }
            WordDoc.Save();
            WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
            //关闭WordApp组件对象
            WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
 
}

小结

1、核心代码中有对字段类型的判断:if(dt.Columns[j].DataType==typeof(System.Byte[])),如果为System.Byte[],则表示为图片类型字段,这是我们自行的约定,对于图片的宽高可以根据实际需要进行设定或定义参数。

2、在根据模板内容,每输出一条记录后,均会插入分页符:

object ib = Word.WdBreakType.wdPageBreak; 
WordApp.Selection.InsertBreak(ref ib);

以保证打印的数据区域独立和完整性,这要根据实际应用来决定是否输出。

以上就是C#实现读取多条数据记录并导出到Word的详细内容,更多关于C#读取数据并导出到Word的资料请关注脚本之家其它相关文章!

相关文章

  • C# 提取PDF中的表格详情

    C# 提取PDF中的表格详情

    这篇文章主要给大家介绍C# 提取PDF中的表格,本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的 类 以及 方法 等来获取表格单元格中的文本内容,需要的朋友可以参考一下
    2021-10-10
  • c#二维码生成的代码分享

    c#二维码生成的代码分享

    c#生成二维码实现示例代码分享,生成方法是调用外网API,为了不直接调用别人的接口,创建一个QrImg.aspx用于显示二维码,传参数即可
    2013-12-12
  • C#关于Textbox滚动显示最后一行,不闪烁问题

    C#关于Textbox滚动显示最后一行,不闪烁问题

    这篇文章主要介绍了C#关于Textbox滚动显示最后一行,不闪烁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 通过C#实现在Excel单元格中写入文本、或数值

    通过C#实现在Excel单元格中写入文本、或数值

    在商业、学术和日常生活中,Excel 的使用极为普遍,本文将详细介绍如何使用免费.NET库将数据写入到 Excel 中,包括文本、数值、数组、和DataTable数据的输入,需要的朋友可以参考下
    2024-07-07
  • C#如何连接MySQL数据库

    C#如何连接MySQL数据库

    这篇文章主要介绍了C#如何连接MySQL数据库,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-10-10
  • C#实现简单记事本程序

    C#实现简单记事本程序

    这篇文章主要为大家详细介绍了C#实现简单记事本程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#和lua相互调用的方法教程

    C#和lua相互调用的方法教程

    lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,所以这篇文章主要给大家介绍了关于C#和lua相互调用的方法教程,需要的朋友可以参考下。
    2017-11-11
  • 使用C#实现一个PPT遥控器

    使用C#实现一个PPT遥控器

    由于本人需要参加的讨论会比较多,每次都会涉及到PPT,有时候坐在电脑旁讲会比较不生动,前人就发明了PPT遥控器,今天就给大家介绍下基于C#实现ppt遥控器,感兴趣的朋友一起看看吧
    2021-05-05
  • C#中四种定时器的用法详解

    C#中四种定时器的用法详解

    日常项目开发中,很多时候都需要用到定时器来处理一些问题,那么c#中各种定时器应该怎么用呢?下面来简单介绍下C#中4种定时器的使用方法说明,感兴趣的朋友可以参考下
    2024-04-04
  • C#文件操作类分享

    C#文件操作类分享

    这篇文章主要为大家分享了C#文件操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论