精华内容
下载资源
问答
  • 内容索引:C#源码,报表打印,打印,Word C# 调用Word软件打印数据库中的数据,再此提醒各位,程序需要Word2003组件,也就是你的电脑需安装Office2003以上版本才行,而且需要打开可编程资源库支持,或者支持找到Interop...
  • C#调用Word
  • 数据库中导出到word调用chm文件、数据库加密、解密等等
  • 郁闷哦!!这个问题已经困咯我一个多星期咯。杂个办哦,学校规定的时间要交项目。拿不出杂的了哦。那位高手能不能帮忙解决下啊谢谢~~~!!!跪谢 

       郁闷哦!!这个问题已经困咯我一个多星期咯。杂个办哦,学校规定的时间要交项目。拿不出杂的了哦。那位高手能不能帮忙解决下啊

    谢谢~~~!!!跪谢 

    展开全文
  • Delphi + Word = 数据库 + 公文处理

    千次阅读 2008-02-20 23:26:00
    Delphi擅长做数据库类的MIS开发,但对于OA就有点力不从心了。不过随着Microsoft的COM技术逐渐成熟,现在普通Windows应用已经可以和Office97无缝结合了,尤其是在Delphi 5中提供了一组Servers组件,更是简化了程序...

    Delphi擅长做数据库类的MIS开发,但对于OA就有点力不从心了。不过随着Microsoft的COM技术逐渐成熟,现在普通Windows应用已经可以和Office97无缝结合了,尤其是在Delphi 5中提供了一组Servers组件,更是简化了程序开发。

    最近接触了一个用户的案例,用Delphi控制Word做一个合同管理程序。办公人员先根据业务需要,写好合同的文字,但在用户名称、产品名称等变化的位置填写指定的标记字符串,然后通过Delphi把数据库中的实际数据替换掉Word中的文字,最后让Word打印出合同。

    Delphi自带了一个简单的Word例题,但功能太简单。通过查找VBA的说明,再对照Delphi的VCL,编写了如下代码,实现了基本的公文管理功能。

    启动Word时用如下代码:

    begin
    try  
    Wordapplication.Connect; 
    except 
    MessageDlg(
    ' Word may not be installed ' , mtError, [mbOk],  0 ); 
    Abort; 
    end; 
    Wordapplication.Visible :
    =  True; 
    WordApplication.Caption :
    =   ' Delphi automation '
    end; 

     

    关闭Word用如下代码。如果想保存Doc文件,请修改SaveChanges变量的内容:

    var 
    SaveChanges, OriginalFormat, RouteDocument: OleVariant; 
    begin 
    SaveChanges :
    =  WdDoNotSaveChanges; 
    OriginalFormat :
    =  UnAssigned; 
    RouteDocument :
    =  UnAssigned; 
    try  
    WordApplication.Quit(SaveChanges, OriginalFormat, RouteDocument); 
    WordApplication.Disconnect; 
    except 
    on E: Exception 
    do  
    begin 
    Showmessage(E.Message); 
    WordApplication.Disconnect; 
    end; 
    end; 
    end; 

     

    让Word打开一个指定的文件,需要先放置OpenDialog,然后调用WordApplication.Documents.Open:

    var 
    ItemIndex :OleVariant; 
    FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, 
    PassWordDocument, PassWordTemplate, Revert, 
    WritePassWordDocument, WritePassWordTemplate, Format: OleVariant; 
    begin 
    if  not dlgOpen.Execute then 
    Exit; 

    {Open document}  
    FileName :
    =  dlgOpen.FileName; 
    ConfirmConversions :
    =  False; 
    ReadOnly :
    =  False; 
    AddToRecentFiles :
    =  False; 
    PassWordDocument :
    =   ''
    PassWordTemplate :
    =   ''
    Revert :
    =  True; 
    WritePassWordDocument :
    =   ''
    WritePassWordTemplate :
    =   ''
    Format :
    =  wdOpenFormatDocument; 

    WordApplication.Documents.Open( FileName, ConfirmConversions, 
    ReadOnly, AddToRecentFiles, PassWordDocument, PassWordTemplate, 
    Revert, WritePassWordDocument, WritePassWordTemplate, Format ); 

    {Assign WordDocument component}  
    ItemIndex :
    =   1
    WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex)); 

    {Turn Spell checking of because it takes a long time if enabled and slowsdown WinWord}  
    WordApplication.Options.CheckSpellingAsYouType :
    =  False; 
    WordApplication.Options.CheckGrammarAsYouType :
    =  False; 
    end; 

    当我们安装delphi时选择的是xp样式的即使用WordXP时,这里的代码需要更改为这样

    var ItemIndex :OleVariant; 
     FileName, ConfirmConversions,ReadOnly,AddToRecentFiles,PasswordDocument, PasswordTemplate,Revert: OleVariant;
     WritePasswordDocument,WritePasswordTemplate,Format: OleVariant;
     Encoding,Visible,OpenAndRepair,DocumentDirection,NoEncodingDialog: OleVariant;

    begin
    if  not dlgOpen.Execute then
    Exit;

    // ...{Open document}
    FileName : =  dlgOpen.FileName;
    ConfirmConversions :
    =  False; 
    ReadOnly :
    =  False; 
    AddToRecentFiles :
    =  False; 
    PassWordDocument :
    =   '' ;
    PassWordTemplate :
    =   ''
    Revert :
    =  True;
    WritePassWordDocument :
    =   ''
    WritePassWordTemplate :
    =   '' ;
       Format: = wdFormatDocument;
       
    // Encoding 
       Visible: = true ;
       WordApplication1.Disconnect;
       WordApplication1.documents.Open(FileName,ConfirmConversions,
                     ReadOnly,AddToRecentFiles, 
                     PasswordDocument,PasswordTemplate, 
                     Revert,WritePasswordDocument,WritePasswordTemplate,Format,
                     Encoding,Visible,OpenAndRepair,DocumentDirection,NoEncodingDialog);
      WordApplication1.Visible:
    = true ;
    {Assign WordDocument component}
    ItemIndex :
    =   1 ;
    WordDocument1.ConnectTo(WordApplication1.Documents.Item(ItemIndex));

    {Turn Spell checking of because it takes a long time if enabled and slows down Winword}
    WordApplication1.Options.CheckSpellingAsYouType :
    =  False;
    WordApplication1.Options.CheckGrammarAsYouType :
    =  False;

    end;

     

    让Word替换标记字符串要使用WordDocument.Range.Find.Execute,这里用Delphi替换了<#Name>:

    var 
    FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike,
    MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace: OleVariant;
    begin 
    FindText :
    =   ' <#Name> '
    MatchCase :
    =  False; 
    MatchWholeWord :
    =  True; 
    MatchWildcards :
    =  False; 
    MatchSoundsLike :
    =  False; 
    MatchAllWordForms :
    =  False; 
    Forward :
    =  True; 
    Wrap :
    =  wdFindContinue; 
    Format :
    =  False; 
    ReplaceWith :
    =   ' Delphi '
    Replace :
    =  True; 

    WordDocument.Range.Find.Execute( FindText, MatchCase, MatchWholeWord,
    MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, 
    Wrap, Format, ReplaceWith, Replace ); 

    end; 

    上面这4段代码完成了公文管理的基本功能,再把它和数据库结合起来,就可以开发一个与Lotus Notes类似的产品了。

    展开全文
  • WORD调用EXCEL数据

    千次阅读 2012-05-11 18:12:10
    当然,我们不否认很多专业化的考证制作工具已经完全把这项任务承担了,但是作为Word中实用又很重要的功能,邮件合并在日常工作中还是有重要的应用。我们以制作一张高考的准考证为例,把整个过程展示给大家,希望您能...
    用的邮件合并功能可以完成很多重复项目的劳动。不知道大家是否意识到,我们最熟悉的准考证也是使用这个完成的。当然,我们不否认很多专业化的考证制作工具已经完全把这项任务承担了,但是作为Word中实用又很重要的功能,邮件合并在日常工作中还是有重要的应用。我们以制作一张高考的准考证为例,把整个过程展示给大家,希望您能在每个步骤中学到有用的东西。需要说明的是,本实例仅仅为熟悉Word操作而撰写,请勿用于非法用途。

      1.准备数据库,定立制作思路

    (图1)  

      首先找一个准考证的实例。

      从例子中学习知识是很有效的。在着手制作之前分析一下文稿的特点,制定相应的策略,可以使你在后面的过程中事半功倍,正所谓“磨刀不误砍柴工”。

      就本例而言,准考证是一个独立的页面,需要完成页面设置(尺寸,页边距等等)、证件名称、具体信息和备注等等。还有一些特殊格式设置,比如边框、下划线等。准考证跟一般文档的不同在于它是在固定的内容,也就是母版上填充不同的数据,如考生姓名。当我们有打印要求时,每一张证件是都不同的,依据的就是数据库中一个个记录。这就是Word邮件合并的用处所在了。首先应该打好模板,也就是将页面不变的部分整理好,留出需要填充的空格,再将它们 与数据库联系起来,最后完成输出。我们从页面的基本设置开始做起。

      2.母版的制作

      根据准考证的规格,首先要把打开Word时默认的纸张改变成需要的格式。这里采取了一个近似的大小,设置窗口长宽为15×12cm。关于页面的设置都被放在了Word“页面设置”选项卡中,因为这是特殊的格式,所以要选择“自定义大小”来完成。

    (图2)

      页面设置好之后,就要将模板中的各个部分输入并定位了。这个时候您应该想到使用表格。朋友们或许有疑问,为什么要插入表格?要知道,我们完全可以采用添加空格的方法来对页面的内容进行定位,这是很多Word初学者理所当然想到的。但我们很不提倡使用这样的方法。Word页面的格式定位最理想的方法就是使用表格,这跟我们制作网页时候的思路是一样的。尤其是面对复杂的各式需要更是如此,朋友们一定要通过例子熟悉起来。从实例的照片可以看出。按照行列数从多的原则,插入一个3×10的表格。

    (图3)

      下面就是按照位置进行填充内容,这可是一项基本功,所设计到的基本操作有:合并单元格、移动表格边线位置。表格对齐方式以及对表格中的字体格式进行设置等等。大家要在实践中慢慢摸索,熟练掌握,制作完成后如图(因为照片的引用稍有复杂,我们暂时插入一张图片示意,实现方法在文后另附)。

    (图4)

      表格的边线是不需要的。文字部分完成之后,要做的就是在视觉上转变的重要一步了。这就是去除这些多余的表格线。当然,并不是真正的删除,只不过是把不必要的框线去掉或者隐藏,将需要的框线改成需要的格式,比如本例中的双下划线。

      设置框线显示与否首先要选中单元格。请注意,选中单元格和选中单元格中的文字是不同的。朋友们会发现如果单元格中没有数据,选择起来会比较困难,那么您只要往其中输入一个空格就可以了。选中单元格后,在“段落”工具组中可以使用下拉菜单直接选择需要的框线,您也可以右键“单元格格式”中进行设置。准考证外围的大框线框粗细和颜色都有不同,由于涉及到的部分比较多,请大家务必细心。我们在此仅展示最后的效果。

    (图5)

      大家注意,在最后需要增添数据的地方也要设置好格式,当我们在后面的步骤进行邮件域合并时会自动按照预先设置的格式进行填充。我们只是照葫芦画瓢,这并不代表最完美的页面呈现方式。在制作过程中需要您尽力发挥自己的想象力,把页面的呈示做到最美,这也是增长技能最重要的环节。

      3.邮件合并

      现在轮到进行数据填充了,这个步骤在Word中被称作“邮件合并”,主要意思就是在Word中将模板与一个数据源进行链接。为了更好说明这个步骤,先来看一下我们的数据源,一个预先设置好的Excel文件,大家可以看到,其中每一列数据都有加黑显示的数据标题,也称之为数据项目。

    (图6)

      第一步:确认数据已经完好后转回到Word中,打开“邮件合并分步向导”开始本实例的核心步骤。注意一定要选择合并类型为“信函”。

    (图7)

      第二步:选择收件人,要在下方选择数据源,点击“浏览”找到数据源所在的表格。

    (图8)

      第三步:接下来会出现这样的窗口。

    (图9)

      很多朋友到了这里往往摸不清楚怎么回事。其实稍加观察就会发现,因为我们添加的excel一个工作薄默认是含有三个工作表,名称分别是“sheet1”“sheet2”“sheet3”,此处不正是让您来选择其中的数据表么?我们选择“sheet1”。可以根据数据表格的具体格式选择“数据首行包含列标题”,Excel还是不能完全智能化,需要手工完成的部分依然有很多。

      第四步:将Excel中的数据项目跟Word中建立联系,这叫做“插入合并域”,这个过程是非常简单的,首先将鼠标移至相应的区域,右侧窗口中选择“其他项目”,在对话框中选择好对应的项目插入即可。建议您在制作表格时候就做好名称的对应关系,这样不会使您的工作出错。

    (图10)

      这是插入完成后的样子,各个区域还仅仅显示域的名称,未能显示具体内容。

    (图11)

      此时,只要选择“预览结果”,效果立刻就可以呈现,在右侧的“预览信函”任务窗中可以使用左右箭头来依次查看各个内容。

    (图12)

      现在我们看到的还仅仅是一个人的准考证,怎样怎样看按照不同考生分列的准考证呢?这就是最后的合并环节,意思是将结果整合在某个单元之中。这个单元可以直接是打印机输出,也可以是Pdf文档。在合并之前还可以选择起始和结束的位置,相当方便。如果您选择“合并到PDF文档”,那么就可以分文件生成生成独立的PDF文档。

    (图13)

      至此,邮件合并的步骤基本介绍完成了,诸如此类需要数据源的证件都可以使用邮件合并的方法来完成。

      4.照片的合并

      回到我们还未完成的一个重要的问题,那就是照片的合并,因为它需要使用到特殊的方法,我们把他单列在最后。这里我们采用的是cro提出的解决方法,具体实现过程如下。

      1.在文件夹中建立统一的照片库,编码最好统一排序;

      2.在表格中输入照片的完整路径,并将“\”改为“\\”

    (图14)

      3.将光标定位于需要插入照片的单元格内,按“Ctrl+F9”来插入一个域,此时单元格内会出现一对大括号,在其中输入“INCLUDEPICTURE "{ MERGEFIELD "照片" }"”(不含外边引号),其中的大括号也是按“Ctrl+F9”来插入的,不可以自行添加。这样就可以显示照片了。

      这就是最后制作完成的准考证式样。

    (图15)

      从这个例子可以看到,一项特殊工作的完成需要各个方面的知识点的汇合,从文档母版的制作一直到打印输出,涉及到页面设置、表格操作和邮件合并。这仅仅是大类,还有很多实际遇到的小内容,小技巧。实践是必不可少的,希望广大读者多多练习,不断提高自己的综合办公水平。

    展开全文
  • 之前我们看到用VB.NET调用Excel VBA的例子比较多,本次是使用VB.NET向Word VBA传递参数,并调用Word VBA生成Word报告或PDF文档。 在Word VBA中,可访问数据库,获得自己想展示的数据,灵活度比较高。 运行环境:VS...
  • java调用PageOffice读取数据库中的数据填充到word模板中,动态生成word文件
  • VBA实现word连接数据库实现邮件合并打印,并调用系统打印机窗口。调用的系统打印机根据返回值确定下一步执行动作。通过后台连接数据库,可去掉烦人的数据刷新提示窗口
  • Word域与数据库的结合编程

    千次阅读 2009-05-22 11:38:00
    本文介绍了Word域与数据库结合的方法,给用户提供一个插入Word域的界面,并把数据库的数据填充到Word文件中。域是Word中最具有实用价值的功能之一,它表示文档中可能发生变化的数据或邮件合并文档中套用信函、标签中...

    本文介绍了Word域与数据库结合的方法,给用户提供一个插入Word域的界面,并把数据库的数据填充到Word文件中。

    域是Word中最具有实用价值的功能之一,它表示文档中可能发生变化的数据或邮件合并文档中套用信函、标签中的占位符。Microsoft Word 可以在您使用一些特定命令时插入域,如"插入"菜单上的"日期和时间"命令。您也可使用"插入"菜单上的"域"命令手动插入域。事实上,我们在日常工作中常会脱离Microsoft Word的操作环境。一般,用户是先建立好一些Word文件模板,然后利用所提供的应用程序功能向Word文件模板中插入域,用该域对应的值取代域值,这样就达到了向Microsoft Word文件中插入数据的作用。我们常把数据放入数据库中,数据库的内容不断地变化,我们的域值也跟着不断地变化,取到灵活自动更新的作用,要达到这方面的功能,就应该把数据库与Word域结合起来。

    解决方法

    首先要解决这一问题,我们必须先了解Word域有关的知识:Word域代码位于花括号或大括号 ( { } )中,域类似于 Microsoft Excel 中的公式:域代码类似于公式,域结果(域结果:当 Microsoft Word 执行域指令时,在文档中插入的文字或图形。在打印文档或隐藏域代码时,将以域结果替换域代码。)类似于公式产生的值。可在文档中切换显示域代码及其结果。正好,数据库的字段名对应域代码,字段值对应域值。我们利用VBA编程可以达到目的。VBA for Word 中有关域的类型很多,其中Type:=wdFieldAddin是一种关于字段与字段值对应的特殊域,正是借助它的功能解决问题。我们可以这么设想,用户先打开Word文件,然后向打开的Word文件中插入域,然后用数据库的数据填充。插入域时有二种可能,一种是单值域,即一个域代码对应一个域值(一对一关系),这种情况的域可以插入任何地方;另一种情况是多值域,即一个域代码对应多个域值(一对多关系)。这种情况的域只能插入表格中,并且当表格的行数比域值少时,要能自动提供增加表格行的功能。

    实例说明

    利用Visual Basic。Net编写通用的类,给用户提供可视化的编辑界面,用于用户在Word文件中插入域标志。针对Word文件或Excel表格文件,扫描整个文件,将其中的域标志取出来,然后通过从数据库中取出字段所对应的值,将值填写到文件中域对应的位置。若对应位置已有值,则判断该值与要填写的值是否相同,若不同则替换之。插入值分为:

    A、单纯的值,直接使用一个值替换域。

    B、表格中的单元格。若该表格填写不下,是否增加表格单元?以及与该单元关联的域等。

    例如,有二个Access数据库的表(:表1对应单值域,表2对应多值域)如下:

    表1:工程

    表2:校核

    利用VBA编写的一个通用的处理Word域的程序。开发步骤如下:

    1、建立项目,向项目中增加处理Word域的类

    启动Visual Studio。NET。在新建项目中选择Visual Basic项目,在模板中选择Windows应用程序,把工程名更改为WordDoc。

    ● 向工程中增加名称为CWordDoc的类。

    ● 定义的CWordDoc类的属性。代码如下:

    以下为引用的内容:
    '定义Word应用对象及文档对象
    Private wdApp As New Word..Application()
    Private wdDoc As New Word.Document()
    '所处理的Word模板文件
    Private FileName As String
    '域的个数及对应的数组
    Dim FieldCount As Int16
    Dim MyField()
    'Word是否已运行
    Private IsWordRunning As Boolean
    '是否已经插入了表格行
    Private IsInsertRow As Boolean 
    'Word工具栏对象及菜单栏对象数组
    Dim CommandBarIndex() As Integer
    Dim SaveCommandBarMenuIndex() As Integer

    ● 定义的CWordDoc类的方法。

    定义打开Word文件的方法。建立Word应用对象和文档对象,并打开Word文件。设定Word已经运行。VBA编程主要是先建立某一个应用程序的对象,然后按需要处理应用对象。Word应用对象是“Word.Application”,通过CreateObject方法建立之。代码如下:

    以下为引用的内容:
    Public Sub OpenWordDocument(ByVal FileName As String)
            wdApp = CreateObject(&quot;Word。Application&quot;)
            wdApp.Documents。Open(FileName)
            wdDoc = wdApp.ActiveDocument
            wdDoc.ActiveWindow.DocumentMap = False
            wdApp.Visible = True
            IsWordRunning = True
    End Sub

    保存Word文件。代码如下:

    以下为引用的内容:
    Public Sub SaveWordDocument()
            wdDoc.SaveAs(FileName)
    End Sub

    定义Word环境的大小。

    Word启动后一般是全屏幕(最大化),要把用户操作界面显示出来,不被Word遮蔽,处理的方法是把用户界面设为顶层窗体,也可使用户界面与Word各自处在自己位置,平行布置。这里是让用户界面位于屏幕的最顶上,Word位于用户界面的下面。因此要重新调整Word的位置,这需要设置Word窗体状态为普通类型(wdWindowStateNormal)。代码如下:

    以下为引用的内容:

    Public Sub SetWordSize(ByVal Left As Integer, ByVal top As Integer,
        ByVal width As Integer, ByVal height As Integer)
            wdApp。WindowState = Word.WdWindowState.wdWindowStateNormal
            wdApp。Left = Left
            wdApp。Top = top
            wdApp。Width = width
            wdApp。Height = height
    End Sub

    这里我们利用Word文档对象中域对象的Add方法向Word文件中插入域。域的Data属性代表该域的名称。插入域时应该选取插入点(Selection),即用户光标处位置。如果该位置是单元格且已插入域,应该提示是否覆盖。插入域时要分析是插入单值域还是多值域。根据关键字的后缀识别,关键字的最后一个字符是'F'时则为多值域。多值域只能插入在表格中。是否是表格以插入点的单元格识别。实现该功能的代码如下:

    以下为引用的内容:
    '在文档中插入域
        'KeyWord:域的关键字
        Public Function InsertField(ByVal KeyWord As String) As Integer
            Dim mySelection As Selection
            Dim Code As String
            Dim MyField As Field
            Dim myRange As Range
            wdApp。Selection。Collapse(Direction:=wdCollapseEnd)
            mySelection = wdApp。Selection      '插入点
            If KeyWord。Chars(KeyWord。Length - 1) = &quot;F&quot; Then
                If IsCell(mySelection) &lt;&gt; True Then
                    MsgBox(&quot;该位置不是单元格,请选择单元格&quot;, vbOKOnly + vbExclamation)
                    Exit Function
                End If
            End If
            If IsCell(mySelection) = True Then
                If CellFieldCount(mySelection) &gt; 0 Then
                    If MsgBox(&quot;该单元格已有域,是否覆盖?&quot;, vbYesNo) = 6 Then
                        mySelection.Cells.Item(1).Select()
                        mySelection.Delete()
                    Else
                        Exit Function
                    End If
                End If
            End If
            MyField = wdDoc.Fields.Add(Range:=mySelection.Range, Type:=wdFieldAddin)
            MyField.Data = KeyWord
        End Function

    我们可以通过选择点的表格数判断插入点的性质。表格数为0,则选择点不位于单元格中,反则不位于单元格中。

    以下为引用的内容:
    '选择点(光标)是否是单元格。
        Private Function IsCell(ByVal mySelection As Selection) As Boolean
            If mySelection.Tables.Count &gt; 0 Then
                Return True
            Else
                Return False
            End If
        End Function
        '计算选择点(光标)的单元格的域数
        Private Function CellFieldCount(ByVal mySelection As Selection) As Integer
            CellFieldCount = mySelection.Cells.Item(1).Range.Fields.Count
    End Function
    '记录插入域代码及关键字。这里主要是调用上面的InsertField方法。
        Public Function InsertFieldByKeyWord(ByVal KeyWord As String) As Integer
            Dim ID As Integer
            FieldCount = FieldCount + 1
            ReDim MyField(FieldCount)
            ID = InsertField(KeyWord)
            MyField(FieldCount).ID = ID
            MyField(FieldCount).KeyWord = KeyWord
    End Function

    当Word文件已经插入了域,就要填充域值。填充域值应该分为二种情况考虑。一种是单值域,一种是多值域。单值域是一一对应关系,仅取出值域插入到对应的位置。实现的方法是扫描整个文档,找出是用户插入的域(Fields.Type = 81),用域值取代之,这里用到了一个由关键字得到值的方法GetFieldValues,这个方法在后面将会讲到,对应的是数据库的"工程"表。怎样保证永远仅插入一个值呢?方法是先清除掉原域值和域代码,再在当前插入点插入域代码和域值。实现的方法如下:

    以下为引用的内容:
    '用关键字对应的值插入值,在文档中在有域的地方插入对应的值
        Public Function InsertValue() As Boolean
            Dim i, Count As Integer
            Dim KeyWord As String
            Dim Value, Data
            Dim mySelection As Selection
            Count = wdDoc.Fields.Count
            For i = 1 To Count
                If wdDoc.Fields.Item(i).Type = 81 Then
                    KeyWord = wdDoc.Fields.Item(i).Data
                    If Right(KeyWord, 1) &lt;&gt; &quot;F&quot; Then
                        Value = clsDB.GetFieldValues(&quot;工程&quot;, KeyWord)
                        wdDoc.Fields.Item(i).Select()
                        mySelection = wdApp.Selection      '插入点
                        If mySelection.Tables.Count &lt;&gt; 0 Then
                            'clear  text
                            mySelection.Cells.Item(1).Select()
                            mySelection.Delete()
                            '还原原域
                            InsertField(KeyWord)
                        End If
                        wdDoc.Fields.Item(i).Result.Text = Value(0).itemarray(0)
                    End If
                End If
            Next
        End Function

    插入多值域时要考虑表格行数够不够,不够时要增加表格行数,且每插入一个值,光标要下移一行。这里对应的是数据库的"校核"表。实现的方法如下:

    以下为引用的内容:

    '插入多值域
        Public Function InsertCollection() As Boolean
            Dim i, j, Count As Integer
            Dim KeyWord As String
            Dim mySelection As Selection
            Dim rec() As Object
            Dim recCount As Integer

            Count = wdDoc.Fields.Count
            For i = 1 To Count
                If wdDoc.Fields.Item(i).Type = 81 Then
                    KeyWord = Trim(wdDoc.Fields.Item(i).Data)
                    If Right(KeyWord, 1) = &quot;F&quot; Then
                        KeyWord = Left(KeyWord, Len(KeyWord) - 1)
                        rec = clsDB.GetFieldValues(&quot;校核&quot;, KeyWord)
                        '选择有域的单元格
                        wdDoc.Fields.Item(i).Select()
                        mySelection = wdApp.Selection      '插入点
                        mySelection.Cells.Item(1).Select()
                        '清除原值
                        mySelection.Delete()
                        '还原原域并更新值
                        InsertField(KeyWord + &quot;F&quot;)
                        wdDoc.Fields.Item(i).Result.Text = rec(0).itemarray(0)
                        '光标下移
                        mySelection.Select()
                        mySelection.MoveDown(Unit:=wdLine, Count:=1)
                        With rec
                            recCount =.GetLength(0) - 1
                            For j = 1 To recCount - 1
                                If IsInsertRow = False Then
                                    Call InsertRow(mySelection, recCount)
                                End If
                                mySelection.Cells.Item(1).Select()
                                mySelection.Delete()
                                mySelection.TypeText(Text:=rec(j).itemarray(0))
                                mySelection.MoveDown(Unit:=wdLine, Count:=1)
                            Next
                        End With
                    End If
                End If
            Next
        End Function
        Private Function InsertRow(ByVal mySelection As Selection,
        ByVal recCount As Integer) As Boolean
            Dim InsertRowCount As Integer           '插入的行数
            Dim CurrCell As Cell
            CurrCell = mySelection.Cells.Item(1)
            InsertRowCount = recCount - mySelection.Tables.Item(1).Rows.Count + 1
            If InsertRowCount &gt; 0 Then
                mySelection.InsertRows(InsertRowCount)
                CurrCell.Select()
                mySelection.MoveUp(Unit:=wdLine, Count:=InsertRowCount)
                IsInsertRow = True
            End If
    End Function

    如果表格行数少于表数据的行数则应该增加表格行数。增加多少表格行数由表数据的行数减去现有表格行数加入计算出来。当插入了行,光标一定下移了几行,这里要还原光标至原来位置,方法是先保留插入点,插入行后,重新选择插入点,使光标上移几行。表格已经插入行以后就不要再插入了,所以至IsInsertRow为真。

    以下为引用的内容:
    '向表格中增加行数。
        Private Function IsInsert(ByVal mySelection As Selection,
        ByVal recCount As Integer) As Boolean
          Dim InsertRowCount As Integer           '插入的行数
          Dim CurrCell As Cell
          CurrCell = mySelection.Cells.Item(1)
          InsertRowCount = recCount - mySelection.Tables.Item(1).Rows.Count + 1
            If InsertRowCount &gt; 0 Then
                mySelection.InsertRows(InsertRowCount)
                CurrCell.Select()
                mySelection.MoveUp(Unit:=wdLine, Count:=InsertRowCount)
                IsInsertRow = True
            End If
    End Function

    Word的菜单和工具箱很多,用户操作时先关掉这些不必要的东西,最后恢复Word环境的原状。

    以下为引用的内容:
    '恢复Word环境的所有命令及菜单。
        Public Sub OpenCommandBar()
            Dim i As Integer
            For i = 0 To UBound(CommandBarIndex) - 1
                wdDoc.CommandBars(i + 1).Visible = True
            Next
            For i = 0 To UBound(SaveCommandBarMenuIndex) - 1
                wdDoc.CommandBars.Item(&quot;Menu Bar&quot;).Controls(i + 1)。Visible = True
            Next
        End Sub
        '关闭Word环境的所有命令及菜单。
        Public Sub CloseCommandBar()
            Dim i As Integer
            Dim cBar
            ReDim CommandBarIndex(1)
            ReDim SaveCommandBarMenuIndex(1)
            i = 0
            For Each cBar In wdDoc.CommandBars
                If cBar.Type = 0 And cBar.Enabled = True Then
                    If cBar.Visible = True Then
                        ReDim CommandBarIndex(i + 1)
                        CommandBarIndex(i) = cBar.Index
                        i = i + 1
                        cBar.Visible = False
                    End If
                End If
            Next
            i = 0
            For Each cBar In wdDoc.CommandBars(&quot;Menu Bar&quot;).Controls
                If cBar.Visible = True Then
                    ReDim SaveCommandBarMenuIndex(i + 1)
                    SaveCommandBarMenuIndex(i) = cBar.Index
                    i = i + 1
                    cBar.Visible = False
                End If
            Next
    End Sub

    2、增加一个处理数据库的类COleDataAccess。

    COleDataAccess类很简单,包含连接数据库的方法ConnAccess,打开静态表的方法GetDataTable,由字段名得到字段值的方法GetFieldValues。

    以下为引用的内容:
    Public Class COleDataAccess
    Private mOleCnnDB As New OleDbConnection()
    '连接Access数据库:DBName数据库名。
        Public Sub ConnAccess(ByVal DBName As String)
            mOleCnnDB.ConnectionString =
    &quot;Provider=Microsoft.Jet.OLEDB.4.0;Password=&quot;&quot;&quot;
    &quot;;User ID=Admin;&quot; &amp;#38; _
             &quot;Data Source='&quot; &amp;#38; DBName &amp;#38; &quot;'&quot;
          mOleCnnDB.Open()
        End Sub
        '获取数据表.strSql查询条件。
        Public Overloads Function GetDataTable(ByVal strSql As String) As DataTable
            Dim myDataSet As New DataSet()
            Dim myOleDataAdapter As New OleDbDataAdapter()
            myOleDataAdapter.SelectCommand = New OleDbCommand(strSql, mOleCnnDB)
            Try
                myOleDataAdapter.Fill(myDataSet)
            Catch er As Exception
                MsgBox(er.ToString)
            End Try
            Return myDataSet.Tables(0)
        End Function
    '由字段名得到字段值的方法:. TableName表名 ; FieldName 字段名
        Public Overloads Function GetFieldValues(ByVal TableName As String,
        ByVal FieldName As String) As Object()
            Dim dr As DataTable
            Dim sql As String
            sql = &quot;select &quot; + FieldName + &quot; from &quot; + TableName
            dr = GetDataTable(sql)
            Dim al(dr.Rows.Count) As Object
            dr.Rows.CopyTo(al, 0)
            Return al
        End Function
    End Class

    3、增加模块Module1

    模块Module1定义COleDataAccess类的变量clsDB,并连接数据库,显示用户窗体。

    以下为引用的内容:
    Module Module1
        Public clsDB As New COleDataAccess()
        Sub main()
            clsDB.ConnAccess(&quot;工程数据。mdb&quot;)
            Dim frm As New frmUserWord()
            frm.ShowDialog()
        End Sub
    End Module

    4、增加用户操作窗体

    向工程中增加一窗体frmUserWord,窗体标题为"处理Word文档",在frmUserWord上加入3个CommandButton,用于打开文件(cmdOpenFile)、填充数据(cmdFill)、保存文件(cmdSave)用的命令按钮;2个ComboBox,用于所插入的字段名;2个 Label;2个CommonDialog,用于执行打开文件和保存文件;打开文件的对话框OpenFileDialog1、保存文件的对话框SaveFileDialog1。界面如下:

    窗体frmUserWord类事实很简单,frmUserWord 类的代码如下:
     

    以下为引用的内容:
    Public Class frmUserWord
        Inherits System.Windows.Forms.Form
    Dim clsDoc As New CWordDoc()
    '打开Word文件。并使处理界面位于Word最顶端,适当调整Word位置,关闭Word其它功能。
    Private Sub cmdOpenFile_Click(ByVal sender As System。Object,
    ByVal e As System。EventArgs) Handles cmdOpenFile。Click
            Dim FileName As String
            OpenFileDialog1.ShowDialog()
            FileName = OpenFileDialog1.FileName
            If FileName = &quot;&quot; Then
                Exit Sub
            End If
            clsDoc.OpenWordDocument(FileName)
            clsDoc.SetWordSize(0, 50, 2000, 2000)
           clsDoc.CloseCommandBar()
            Me.Top = 0
            Me.Left = 0
            Me.Width = 10000
            Me.Height = 80
            ComboBox1.Enabled = True
            ComboBox2.Enabled = True
            cmdSave.Enabled = True
            cmdFill.Enabled = True
    End Sub

    在Form的Load事件中定义打开和保存文件的格式,并填充ComboBox数据。ComboBox数据对应数据库表的字段名。
     

    以下为引用的内容:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles MyBase.Load
            Dim i As Integer
            OpenFileDialog1.Title = &quot;打开文件&quot;
            OpenFileDialog1.Filter = &quot;Word文档(*.doc)|*.doc|Word文档模板(*.dot)|*.dot&quot;
            SaveFileDialog1.Title = &quot;保存文件&quot;
            SaveFileDialog1.Filter = &quot;Word文档(*.doc)|*.doc|Word文档模板(*.dot)|*.dot&quot;
            Dim dt As New DataTable()
            dt = clsDB.GetDataTable(&quot;select * from 工程&quot;)
            For i = 0 To dt.Columns.Count - 1
                ComboBox1.Items.Add(dt.Columns.Item(i).ColumnName)
            Next
            dt = clsDB.GetDataTable(&quot;select * from 校核&quot;)
            For i = 0 To dt.Columns.Count - 1
                ComboBox2.Items.Add(dt.Columns.Item(i).ColumnName)
            Next
        End Sub
       '填充数据
        Private Sub cmdFill_Click(ByVal sender As System.Object, ByVal e As
    System。EventArgs) Handles cmdFill.Click
            clsDoc.InsertValue()
            clsDoc.InsertCollection()
        End Sub
    '用户选择所插入域的域名,并在光标处插入单值域。
        Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object,
        ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            clsDoc.InsertField(sender.Text)
        End Sub
    '用户选择所插入域的域名,并在光标处插入多值域。
    域所对应多值时,域只能插入表格中。且要与单值域区分,标记为多值插入。
        Private Sub ComboBox2_SelectedValueChanged(ByVal sender As Object,
        ByVal e As System.EventArgs) Handles ComboBox2.SelectedValueChanged
            Dim KeyWord As String
            KeyWord = sender.Text + &quot;F&quot; '标记是多值
            clsDoc.InsertField(KeyWord)
        End Sub
    '保存Word文件。
        Private Sub cmdSave_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles cmdSave.Click
            clsDoc.SaveWordDocument()
    End Sub
    '打开Word的命令菜单及工具箱。
    Private Sub frmUserWord_Closed(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles MyBase.Closed
            clsDoc.OpenCommandBar()
        End Sub
    End Class

    5、应用与测试

    一般,此种应用是作为一个软件的一部分,我们可以把它生成组件来用,方法把项目的输出类型改为类库后,把它生成DLL文件就可。这里为了方便测试就直接把它生成应用程序。

    下面对它运行时的结果如下:


    打开一Word文件运行后的界面如下:

    结论

    上面方法介绍了Word域的利用,利用VBA编写Word域的方法。Word域所对应的数据库的字段的单值和多值的关系,极有普遍性,很有实用价值。

    展开全文
  • 本文档详细说明了java调用ireport环境搭建及数据库配置等,及java怎么调用ireport生成报告,附带java生成的报告代码只是word的,生成excel或者PDF可以修改方法即可。内容包含数据库连接配置,参数设置。
  • Word域与数据库的结合编程 conanpaul

    千次阅读 2007-04-29 01:46:00
    Word域与数据库的结合编程TheEdge推荐 [2006-10-28]出处:ccidnet赛迪网作者:天雨 本文介绍了Word域与数据库结合的方法,给用户提供一个插入Word域的界面,并把数据库的数据填充到Word文件中。 域是Word中最具有...
  • VB数据库导出WORD

    千次阅读 2010-03-19 11:15:00
    这里的数据库采用的是ACCESS生成的MDB数据库。...Dim cn As New ADODB.Connection ‘定义数据库Dim rs As New ADODB.RecordsetDim scan As String ‘存储查找数据库Dim Appword As Word.Application ’定义WORD
  • Delphi调用Word

    千次阅读 2004-11-09 16:35:00
    Delphi + Word = 数据库 + 公文处理Delphi擅长做数据库类的MIS开发,但对于OA就有点力不从心了。不过随着Microsoft的COM技术逐渐成熟,现在普通Windows应用已经可以和Office 97无缝结合了,尤其是在Delphi 5中提供了...
  • Java 导出数据库表信息生成Word文档

    千次阅读 2019-11-07 09:46:59
    -- ================== 将数据库表信息生成word文档信息所需 ====================== --> <!-- https://mvnrepository.com/artifact/com.lowagie/itext --> <dependency> ...
  • Java开发中解析word文档录入数据库

    千次阅读 2019-08-25 21:16:01
    目录 1.解决思路 ...但是在网上找了两天别人分享的方法POI没有一个可以实现的,最后老大给了一个思路是先转将Word文档转为HTML文件,再来解析HTML文件,事实证明是可行的。 2.导入的包 jacob.jar...
  • JSP调用word

    千次阅读 2009-09-02 10:56:00
    1.将表单数据输出到word 可以用HttpServetResponse对象的setContentType()方法设置文件的表现形式。其关键代码如下: response.setContentType("application/msword"); setContentType头提供了响应文档MIME。通过...
  • VC++中调用word

    2009-08-26 14:59:00
    但是VC++中调用word的确不容易,特别是对word中各种函数的使用,本文以作者的工作经验详细介绍一下如何调用word和进行word表格的填写,有同样需求的编友也可查看一下MSDN中的Automation Microso
  • VC++中调用word进行word表格的填写

    千次阅读 2011-05-15 23:29:00
    或者程序能提取数据库的内容生成word表格,使用户能方便的查看和修改,打印。但是VC++中调用word的确不容易,特别是对word中各种函数的使用,本文以作者的工作经验详细介绍一下如何调用word和进行word表格的填写,有...
  • 2000年09月12日 09:13:00 znsoft翻译 作者: John Lim.... 这儿是几个我试过的例子。希望这些给你一些概念。注意的是这些只能运行在32位的Microsoft Windows平台下。...ADO里面包括连接数据库的对象,从
  • java调用word转html命令行工具.
  • VC调用ADO访问ACCESS数据库

    千次阅读 2005-06-06 18:24:00
    在stdafx.h中导入msado15.dll#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF", "adoEOF")#endif // _AFX_NO_AFXCMN_SUPPORT可以换成另一种方式调用:#include
  • java调用kettle动态传参修改数据库连接 感言:网络的确帮助了我们,但是kettle的资料真实太少,英语学好是有必要的; 整体思路:创建javaproject→导入kettle所需要的包→实现kettle中的对象→重写...
  • 根据宽度换行 style="word-break:break-all" <td width="596px" colspan="2" style="word-break:break-all" align="left" class="style4" valign="top"></td> //这样的话每行的宽度就是596px了 比如...
  • java调用pageoffice生成word

    千次阅读 2018-05-08 12:17:16
    一、在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jacob、poi、java2word、...
  • mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME} -p${PASS_WORD} ${DBNAME} -e "${select_sql}" } HOST=$1; exe_secelt "$HOST" 运行python 脚本 python test_mysql.py 注:在编写shell的工程中发现一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,987
精华内容 25,194
关键字:

word调用数据库