生成word文档_word文档生成 - CSDN
精华内容
参与话题
  • POI生成word文档

    2020-07-28 23:32:03
    最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用POI模板生成word文档。里面包括完整代码和所需jar包。
  • 用 Python 自动生成 Word 文档

    万次阅读 多人点赞 2018-08-14 16:04:04
    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,...注:本库仅支持生成Word2007以后版本的文档类型,即扩展名为.doc...

    当然要用第三方库啦 :)

    使用以下命令安装:

    pip install  python-docx

    使用该库的基本步骤为:

    1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件)。

    2.设置文档的格式(默认字体、页面边距等)。

    3.在文档对象中加入段落文本、表格、图像等,并指定其样式。

    4.保存文档。

    注:本库仅支持生成Word2007以后版本的文档类型,即扩展名为.docx 的。

    下面分步介绍其基本使用方法:

    步骤一:

    from docx import Document
    
    doc = Document()                #以默认模板建立文档对象
    
    doc = Document('a.docx')     # 读取a.docx文档,建立文档对象

    步骤二:

    from docx.shared import Inches,Pt
    
    def chg_font(obj,fontname='微软雅黑',size=None):
    
        ## 设置字体函数
    
        obj.font.name = fontname
    
        obj._element.rPr.rFonts.set(qn('w:eastAsia'),fontname)
    
        if size and isinstance(size,Pt):
    
            obj.font.size = size
    
    
    distance = Inches(0.3)
    
    sec = doc.sections[0]             # sections对应文档中的“节”
    
    sec.left_margin = distance     # 以下依次设置左、右、上、下页面边距
    
    sec.right_margin = distance
    
    sec.top_margin = distance
    
    sec.bottom_margin = distance
    
    sec.page_width =Inches(12)        #设置页面宽度
    
    sec.page_height = Inches(20)       #设置页面高度
    
    ##设置默认字体
    
    chg_font(doc.styles['Normal'],fontname='宋体')

    步骤三:

    1.添加段落文本

    paragraph =doc.add_paragraph('text....')
    
    ph_format =paragraph.paragraph_format
    
    ph_format.space_before =Pt(10)     #设置段前间距
    
    ph_format.space_after =Pt(12)       #设置段后间距
    
    ph_format.line_spacing=Pt(19)       #设置行间距

    如果希望同一段落中的文本格式不同,就需要使用Run对象(可以理解为可以单独设置格式的段落内对象)。

    如:

    run = paragraph.add_run('text...')
    
    run.bold = True #设置字体为粗体
    
    chg_font(run,fontname='微软雅黑', size=Pt(12))  #设置字体和字号

    2.添加表格,并写入相关内容

    tab =doc.add_table(rows=4,cols=4)   #添加一个4行4列的空表
    
    cell=tab.cell(1,3)  #获取某单元格对象(从0开始索引)

    在单元格中添加文本:

    cell.text='abc'

    在单元格中添加多行文本(指定转行)

    ph =cell.paragraphs[0]
    
    run=ph.add_run(‘text....’)'
    
    run.add_break()               # 添加一个折行
    
    run.add_picture('a.png')   # 插入图像,可以是内存中的图像,width=Inches(1.0)指定宽度。

    3.在文档中添加图像:

    doc.add_picture('a.png')

    步骤四:

    doc.save('a.docx')       # 保存图像

    做一个简单的测试,其生成文档的速度还是比较快的。感觉比以前用reportlab库生成PDF文档要快不少呢!

    下图是用此方式生成docx文档的截图:

    展开全文
  • (前年11月就说要写这篇技术日志了,一直拖到今天,直到自己觉得再不写会忘掉的时候。唉,现在自己果然是很懒啊,争取以后能一个星期写一篇,我... 用Visual C++操纵MS Word: http://www.cnblogs.co

    (前年11月就说要写这篇技术日志了,一直拖到今天,直到自己觉得再不写会忘掉的时候。唉,现在自己果然是很懒啊,争取以后能一个星期写一篇,我是不是应该到CSDN去写呢?总是感觉在校内写技术日志不伦不类……)
    ---------------------------------------

    首先,把我参考的两个地址放上来,博主写到很好,我这里只是把学到的东西做记录自己备查而已。

    Visual C++操纵MS Word:

    http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028697.html

    MFC/VC++调用word进行报表制作:

    http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028717.html

     

    其次,说说重点:

    重点就是怎么把VBA_Sub MyReporter.bas里的VBA代码转换成WORD.OLE代码,上面的两篇文章写的很好,照着一步一步做就成了。

     

    下面,一步一步开始吧:

    1. 首先,要打开Word的宏记录功能。

    备注:在Word中,使用VBA为脚本的宏,可以使文件具有一定逻辑处理功能。例如自动生成及处理数据等。

     

    2. 然后创建一个新宏

     

    3. 记录一个宏,在记录好以后,可以对宏进行简单的编辑,想调试看运行结果时,点击“运行”按钮。这一步很重要,在把这个VBA脚本翻译成C++可执行的代码前,这里的逻辑就是最后生成Word文档的逻辑,因此,要仔细调试,把其中没有必要的步骤去除,尽量精简生成文档的步骤。

     

    4. 在最终获得一个这样的脚本后,就可以准备开始C++的编程了,这里,贴出我完成的脚本(为了不公开项目里的数据,这里我稍做改动,把数据相关的内容全部替换了)

    Sub MyReporter()
        Documents.Add DocumentType:=wdNewBlankDocument
    ' //生成一个空文档
       
        Selection.TypeText Text:="某某报表"
    ' //输入第1行内容
        Selection.TypeParagraph
    ' //换行
        Selection.TypeText Text:="行1:"
    ' //输入第2行内容
        Selection.TypeParagraph
    ' //换行
        Selection.TypeText Text:="行2:"
    ' //输入第3行内容
        Selection.TypeParagraph
    ' //换行
        Selection.TypeText Text:="行3:"
    ' //输入第4行内容
        Selection.TypeParagraph
    ' //换行
        Selection.TypeText Text:="行4:"
    ' //输入第5行内容
        Selection.TypeParagraph
    ' //换行
        Selection.TypeText Text:="行5"
    ' //输入第6行内容
        Selection.TypeParagraph
    ' //换行
       
        ' //添加一个6行4列的表格,使用默认样式
        ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=6, NumColumns:= _
            4, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
            wdAutoFitFixed
       
       
    ' //添加表的内容并设置表的格式
        ' //输入表内第1行内容

        Selection.TypeText Text:="列1"
    ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1
    ' //向右移动鼠标到下一列
        Selection.TypeText Text:="列2"
    ' //输入第2列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1
    ' //向右移动鼠标到下一列
        Selection.TypeText Text:="列3"
    ' //输入第3列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 ' //向右移动鼠标到下一列
        Selection.TypeText Text:="列4"
    ' //输入第4列内容
        ' //输入表内第2行内容
        Selection.MoveDown Unit:=wdLine, Count:=1 ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3
    ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1"
    ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3
    '// 向右移动鼠标到第4列
        Selection.TypeText Text:="列4"
    ' //输入第4列内容
        ' //输入表内第3行内容
        Selection.MoveDown Unit:=wdLine, Count:=1
    ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3
    ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1"
    ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1
    ' // 向右移动鼠标到第2列
        Selection.TypeText Text:="列2"
    '//输入第2列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1
    ' // 向右移动鼠标到第3列
        Selection.TypeText Text:="列3"
    '//输入第3列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=1 
    ' // 向右移动鼠标到第4列
        Selection.TypeText Text:="列4"
    '//输入第4列内容
        ' //输入表内第4行内容
        Selection.MoveDown Unit:=wdLine, Count:=1
    ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3
    ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1"
    ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3
    ' //向右移动鼠标到第4列
        Selection.TypeText Text:="列4"
    ' //输入第4列内容
        ' //输入表内第5行内容
        Selection.MoveDown Unit:=wdLine, Count:=1
    ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3
    ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1"
    ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3
    ' //向右移动鼠标到第4列
        Selection.TypeText Text:="列4"
    ' //输入第4列内容
        ' //输入表内第6行内容
        Selection.MoveDown Unit:=wdLine, Count:=1
    ' //向下移动鼠标到下一行
        Selection.MoveLeft Unit:=wdCharacter, Count:=3
    ' //向左移动鼠标到第1列
        Selection.TypeText Text:="列1"
    ' //输入第1列内容
        Selection.MoveRight Unit:=wdCharacter, Count:=3
    ' //向右移动鼠标到第4列
        Selection.TypeText Text:="列4"
    ' //输入第4列内容
        ' //设置表的格式
        Selection.MoveUp Unit:=wdLine, Count:=5
    ' //向上移动鼠标到表的第1行(目前鼠标在第1行第4列最后一个字符后)
        Selection.MoveLeft Unit:=wdCharacter, Count:=15
    ' //向左移动鼠标到第1列的第1个字符前
        Selection.MoveDown Unit:=wdLine, Count:=5, Extend:=wdExtend
    ' //向下选取5行,共选取6行(执行这句后,第1列全部选中)
        Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend
    ' //向右选取3列,共选取4列(执行这句后,整个表被选中)
        Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    ' //设置对齐方式为“居中”
       
        ' //开始设置表以前内容的格式
        Selection.MoveUp Unit:=wdLine, Count:=1
    ' //向上移动鼠标到上一行
        Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    '//设置此行为“居中”格式 
        Selection.MoveUp Unit:=wdLine, Count:=5
    '// 向上移动鼠标到第1行
        Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    '//设置标题行为“居中”格式
        Selection.EndKey Unit:=wdLine
    ' //将鼠标定位到第1行末
        Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
    ' //将鼠标定位到第1行首,同时选取整行
        Selection.Font.Bold = wdToggle
    ' //设置标题行为“粗体”   
        Selection.Font.Size = 15 ' //设置标题行字号为15(小三号)
        Selection.MoveDown Unit:=wdLine, Count:=1
    ' //向下移动鼠标到正文第1行
        Selection.HomeKey Unit:=wdLine ' //将鼠标定位到正文第1行首,(第2行行首)
        Selection.MoveDown Unit:=wdLine, Count:=11, Extend:=wdExtend
    ' //向下选取除标题行外的全部内容
        Selection.Font.Size = 12
    ' //设置字号为12(小四号)
        Selection.WholeStory
    '// 选取全部内容
        Selection.Font.Name = "宋体"
    '// 设置全部内容为“宋体”
       
       
    ' //保存文件为《某某报表.doc》到默认位置,WORD的默认路径是“我的文档”
        ActiveDocument.SaveAs FileName:="某某报表.doc", FileFormat:= _
            wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
            True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
            False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
            SaveAsAOCELetter:=False
           
       
    ' 退出程序,关闭Word
        Application.Quit
    End Sub

     

    5. 这就是最后一步了,就是把上面的VBA编程C++可执行的代码。当然,在生成这个工程的时候,一定要添加外部的库,这里,在MFC中操作WORD2003的库使用的是 MSWORD.OLB ,一般情况下,可以在OFFICE所在的文件夹下,通过搜索获得。对于如何添加这个外部链接库,这里不做记录了,会MFC的人,这个是基本功。那么在生成MFC工程后,把上面的VBA代码,一条一条翻译成C++的代码就行了,以下是翻译的结果:

    (把以下代码放到一个事件中,比如对一个Button的单击响应事件中,就可以运行了)

     //****待用的操作WORD的 常量
     const int wdCharacter = 1;
     const int wdLine = 5;
     const int wdAlignParagraphCenter = 1;
     const int wdExtend = 1;
     const int wdToggle = 9999998;
     const int wdFormatDocument = 0;
     const int wdWord9TableBehavior = 1;
      const int wdAutoFitFixed = 0;
     const int wdNULL = 0;
     const int wdNewBlankDocument = 0;
     const int wdWindowStateMinimize = 2;

     //****待用的操作WORD的 变量
     _Application wordApp;
        Documents wordDocs;
        _Document wordDoc;
        Selection wordSelection;
     Range wordRange;
     Tables wordTables;
     Table wordTable;
     Cell wordCell;
     Cells wordCells;
     _Font wordFont;
     Shading wordShading;
     Paragraphs wordParagraphs;

     //****创建word application实例,失败的话返回false
     if (!wordApp.CreateDispatch(_T("Word.Application")))
     {
      AfxMessageBox("Word CreateDispatch Failed!"); 
    //显示错误信息
      return FALSE;
    //返回false
     }    
     
     wordDocs=wordApp.GetDocuments();//获得 documents 实例 

     //****添加新的空白文档(调用COM)
     //(参考自:
    http://www.cnblogs.com/scq2099yt/archive/2008/01/07/1028717.html
     CComVariant tpl(_T("")),Visble,DocType(0),NewTemplate(false);
     wordDoc=wordDocs.Add(&tpl,&NewTemplate,&DocType,&Visble);
     wordSelection=wordApp.GetSelection(); //获得 wordSelection 实例

     //****添加文字 
     wordSelection.TypeText("某某报表");
    //输出1行
     wordSelection.TypeParagraph();
    //换行
     wordSelection.TypeText("行1:");
    //输出2行
     wordSelection.TypeParagraph();
    //换行
     wordSelection.TypeText("行2:"); 
    //输出3行
     wordSelection.TypeParagraph();
    //换行
     wordSelection.TypeText("行3:"); //输出4行
     wordSelection.TypeParagraph();
    //换行
     wordSelection.TypeText("行4:");
    //输出5行
     wordSelection.TypeParagraph();
    //换行
     wordSelection.TypeText("行5");
    //输出6行
     wordSelection.TypeParagraph();
    //换行
     
     //****插入表格
     wordTables=wordDoc.GetTables();
    //获得表格
     wordRange = wordSelection.GetRange();
     
    //添加一个6行4列的表格,使用默认样式
     wordTables.Add(wordRange,
      6,
    // 行数
      4,
    // 列数
      COleVariant((short)wdWord9TableBehavior),
      COleVariant((short)wdAutoFitFixed));
     
    /*** 注意 COleVariant((short)XXX) 这个方法可以把int型转换为 VARIANT* 类型 ***/
     
     //添加表的内容并设置表的格式
     //输入表内第1行内容
     wordSelection.TypeText("列1");
    //输入第1列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向右移动鼠标到下一列
     wordSelection.TypeText("列2");
    //输入第2列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向右移动鼠标到下一列
     wordSelection.TypeText("列3");
    //输入第3列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向右移动鼠标到下一列
     wordSelection.TypeText("列4");
    //输入第4列内容 
     //输入表内第2行内容
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向左移动鼠标到第1列
        wordSelection.TypeText("列1");
    //输入第1列内容   
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向右移动鼠标到第4列
     wordSelection.TypeText("列4");
    //输入第4列内容
     //输入表内第3行内容
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列
        wordSelection.TypeText("列1"); //输入第1列内容   
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向右移动鼠标到第2列
     wordSelection.TypeText("列2");
    //输入第2列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向右移动鼠标到第3列
     wordSelection.TypeText("列3");
    //输入第3列内容
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向右移动鼠标到第4列
     wordSelection.TypeText("列4");
    //输入第4列内容
     //输入表内第4行内容
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向左移动鼠标到第1列
        wordSelection.TypeText("列1");
    //输入第1列内容   
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL)); //向右移动鼠标到第4列   
     wordSelection.TypeText("列4");
    //输入第4列内容
     //输入表内第5行内容
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向左移动鼠标到第1列
        wordSelection.TypeText("列1");
    //输入第1列内容   
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向右移动鼠标到第4列   
     wordSelection.TypeText("列4");
    //输入第4列内容
     //输入表内第6行内容
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向下移动鼠标到下一行
     wordSelection.MoveLeft(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向左移动鼠标到第1列
        wordSelection.TypeText("列1");
    //输入第1列内容   
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdNULL));
    //向右移动鼠标到第4列
     wordSelection.TypeText("列4");
    //输入第4列内容
     //设置表的格式
     wordSelection.MoveUp(COleVariant((short)wdLine),
      COleVariant((short)5),
      COleVariant((short)wdNULL));
    //向上移动鼠标到表的第1行(目前鼠标在第一行第4列最后一个字符后)
     wordSelection.MoveLeft(COleVariant((short)wdCharacter),
      COleVariant((short)15),
      COleVariant((short)wdNULL)); //向左移动鼠标到第1列的第1个字符前
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)5),
      COleVariant((short)wdExtend));
    //向下选取5行,共选取6行(执行这句后,第1列全部选中)
     wordSelection.MoveRight(COleVariant((short)wdCharacter),
      COleVariant((short)3),
      COleVariant((short)wdExtend));
    //向右选取3列,共选取4列(执行这句后,整个表被选中)
     wordParagraphs = wordSelection.GetParagraphFormat();
    //获得对齐方式实例
     wordParagraphs.SetAlignment(wdAlignParagraphCenter);
    //设置表中的全部内容为“居中”
       
     //开始设置表以前内容的格式
     wordSelection.MoveUp(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向上移动鼠标到上一行
        wordParagraphs = wordSelection.GetParagraphFormat(); //获得对齐方式实例
     wordParagraphs.SetAlignment(wdAlignParagraphCenter); //设置此行为“居中”格式
        wordSelection.MoveUp(COleVariant((short)wdLine),
      COleVariant((short)5),
      COleVariant((short)wdNULL));
    // 向上移动鼠标到第1行
     wordParagraphs = wordSelection.GetParagraphFormat();
    //获得对齐方式实例
     wordParagraphs.SetAlignment(wdAlignParagraphCenter);
    //设置标题行为“居中”
     wordSelection.EndKey(COleVariant((short)wdLine),
      COleVariant((short)wdNULL));
    //将鼠标定位到第1行末
     wordSelection.HomeKey(COleVariant((short)wdLine),
      COleVariant((short)wdExtend));
    //将鼠标定位到第1行末
     wordFont = wordSelection.GetFont();
    //获得字体实例
     wordFont.SetBold(wdToggle); //设置标题行为“粗体”    
     wordFont.SetSize(15.0);
    //设置标题行字号为15(小三号)
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)1),
      COleVariant((short)wdNULL));
    //向下移动鼠标到正文第1行
     wordSelection.HomeKey(COleVariant((short)wdLine),
      COleVariant((short)wdNULL)); //将鼠标定位到正文第1行首,(第2行行首)
     wordSelection.MoveDown(COleVariant((short)wdLine),
      COleVariant((short)11),
      COleVariant((short)wdExtend));
    //向下选取除标题行外的全部内容
     wordFont = wordSelection.GetFont(); //获得字体实例
     wordFont.SetSize(12.0);
    //设置标题行字号为12(小四号)
     wordSelection.WholeStory();
    // 选取全部内容
     wordFont = wordSelection.GetFont();
    //获得字体实例
     wordFont.SetName("宋体"); //设置全部内容为“宋体”


     //保存文件为《某某报表.doc》到默认位置,和此程序在一起
     CString fileName = "//某某报表.doc";
     CString fullFileName = GGetAppPath() + fileName;
     wordDoc.SaveAs(COleVariant(fullFileName),
    //FileName
      COleVariant((short)wdFormatDocument),
    //FileFormat
      COleVariant((short)FALSE),
    //LockComments
      COleVariant(""), //Password
      COleVariant((short)FALSE),
    //AddToRecentFiles
      COleVariant(""), //WritePassword
      COleVariant((short)FALSE), //ReadOnlyRecommended
      COleVariant((short)FALSE), //EmbedTrueTypeFonts
      COleVariant((short)FALSE), //SaveNativePictureFormat
      COleVariant((short)FALSE), //SaveFormsData
      COleVariant((short)FALSE),
    //SaveAsAOCELetter
      COleVariant((short)wdNULL), //Encoding
      COleVariant((short)FALSE),
    //InsertLineBreaks
      COleVariant((short)FALSE),
    //AllowSubstutitions,
      COleVariant((short)wdNULL),
    //LineEnding
      COleVariant((short)wdNULL)
    //AddBiDiMarks
      );
     
     
    //退出程序,关闭Word
     wordApp.Quit(COleVariant((short)wdNULL),
      COleVariant((short)wdNULL),
      COleVariant((short)wdNULL));

     return TRUE; // 生成成功,返回TRUE

     

    6. 最后,编译,调试,运行,哈哈,最后,我生成了一个这样的表:

    展开全文
  • java 生成 word 文档的多种方法(一)

    千次阅读 2019-01-25 15:31:51
    一、想生成word文档,首先要有生产word的模板,这里给大家介绍三种方式,每种方式有相应的生产word文档的代码: 1、html 模板 生成方式,打开word文档样例,如下图所示!  然后单击F12 ,后显示如下 选择...

    前几天项目中遇到word 文档不标准问题,我详细查找原因,总结 了几种方案,现在和大家分享一下。

    一、想生成word文档,首先要有生产word的模板,这里给大家介绍三种方式,每种方式有相应的生产word文档的代码:

    1、html 模板 生成方式,打开word文档样例,如下图所示!

     然后单击F12 ,后显示如下

    选择网页文件,保存后生成html格式的 文档 ,打开后如下图

    word模板就再此基础上修改,标签:${ }  例如:${name},如果有多个对象可以用 list标签  如:<#list  applicants as applyer>,更多的标签大家可以网上查询一下这里就不多写了。

    A:这种html模板生成word文档,一般我们用freemarker 技术处理。再介绍一种模板后我们就上代码(因为有几张模板的代码实现基本是一样的),所需jar包:freemarker-2.3.16.jar

    2、xml模板生产方式,首先给大家明确一下,原则上有两种xml模板,非原生的xml模板和原生的xml模版,这两张模板生成word文档的原理不一样,后面我会详细介绍。因为非原生的xml模板和html生成word文档的原理一样,这里就先介绍非原生xml模板的生产方式,如图:

    A:如图选择xml格式,生成xml模板。注意:这里有一个必须要留意的地方,你打开文档所用的office 版本,希望大家进来用office2003版本(低版本),这里有一个向下兼容问题,程序员应该都理解这个道理。切记不要用wps打开word文档去另存为xml,因为wps兼容性太好,后期生成的word文档,会存在很多问题,主要是客户打不开(因为客户本地电脑的打开word文档的工具不确定)。xml模板里面的参数修改和html类似,改好后把文件尾由  .xml 改成  .ftl  另外文件名尽量用英文 不要用汉字。

    3、通过java代码把以上两种模板生成word文档;


    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.Dispatch;

    import freemarker.template.Configuration;
    import freemarker.template.DefaultObjectWrapper;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;

    /**  
    * @author: wanghuainan
    * @version:    
    * @Date: Created in 2018年11月30日
    *
    */
    public class BoKeWordTest1 {  
        
       public static void main(String[] args) throws Exception {  
           Map<String,Object> dataMap=new HashMap<String,Object>();  
           getData(dataMap);  
           freemarkerHtmlTest(dataMap,null,null);
       }  
        
       //封装模板参数
       private static void getData(Map<String, Object> dataMap) {  
           dataMap.put("nian", "2016");  
           dataMap.put("yue", "3");  
           dataMap.put("address", "深圳市");   
           dataMap.put("name", "南道1");   
           dataMap.put("sex", "6");   
           dataMap.put("nling", "lc");  
           dataMap.put("xuehao", "111");  
           dataMap.put("neirong", "hhh好好");  
            
           List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();  
           for (int i = 0; i < 3; i++) {  
               Map<String,Object> map = new HashMap<String,Object>();  
               map.put("xuehao", i);  
               map.put("neirong", "内容"+i);  
               list.add(map);  
           }  
            
           dataMap.put("list", list);  
       }  
       //正式生产word文档
       public static String freemarkerHtmlTest(Map<String, Object> paramMap,String filePath,String fileName) throws Exception{
           //创建一个合适的Configration对象
     
           fileName = "bokeceshi.ftl";
           filePath ="E://template/judicial/";
     
           String sourcePath ="E://template/judicial/outFileBoKe"+".doc";
           Configuration configuration = new Configuration();
           configuration.setDirectoryForTemplateLoading(new File(filePath));
           configuration.setObjectWrapper(new DefaultObjectWrapper());
           configuration.setDefaultEncoding("UTF-8");   //这个一定要设置,不然在生成的页面中 会乱码
           //获取或创建一个模版。
           Template template = configuration.getTemplate(fileName);
           Writer out = null;
           File outFile = new File(sourcePath); //导出文件
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));  
            //Template template = configuration.getTemplate(fileName,"utf-8");
            template.process(paramMap, out); //将填充数据填入模板文件并输出到目标文件
           out.close();
           
           return null;
       }
     
       @SuppressWarnings("unused")
        private void wordToDoc(String filePath){
            //Word.Application代表COM OLE编程标识,可查询MSDN得到  
            ActiveXComponent app = new ActiveXComponent("Word.Application");  
            //设置Word不可见  
            app.setProperty("Visible",false);  
            //调用Application对象的Documents属性,获得Documents对象  
            Dispatch docs = app.getProperty("Documents").toDispatch();  
            //Dispatch doc = Dispatch.call(docs,"Open",sourcePath,new Variant(false),new Variant(true)).getDispatch();  
            Dispatch doc = Dispatch.call(docs,"Open",filePath).getDispatch();
            Dispatch.call(doc,"SaveAS",filePath,12);  
            //关闭打开的Word文件  
            Dispatch.call(doc,"Close",false);  
            //关闭Word应用程序  
            app.invoke("Quit",0);  
        }
    }

    A:测试方法如上,完全成功:xml模板和生成的文档示例如下:

     

     

    到这里大家应该一目了然了吧!

    4、这里稍微补充几点

    A:希望大家尽量用xml模板,因为xml模板生产的word文档符合标准的office格式,通用;而html生成的word文档属于网页版,不标准。

    B:这里xml生的word文档打开后点击F12发现是xml格式的,如下图

     即他是非加密的word 文档,但是不影响使用。这里有个加密的方法大家可以用一下

    filePath就是生成的word文档路径。但是此方法只能在window环境使用,配置也比较麻烦,大家可以试试。标准的加密方法下一篇文章给大家详细分享,谢谢!有问题及时留言!!

    展开全文
  • java 根据模板文件生成word文档

    万次阅读 多人点赞 2018-09-19 16:18:05
    最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式----feemarker基于word模板的导出方式, ...

      原文链接:https://blog.csdn.net/zhangzhangjava/article/details/52937159

     

    最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式----feemarker基于word模板的导出方式, 这种方式非常简单而且导出的样式美观, 其原理就是先做一个word模板, 该模板中变量数据用${xxx}这种方式填写, 然后再导出时只需读取模板然后用相应的数据替换其中的${xxx}即可. 

         
           一,简单模板导出(不含图片, 不含表格循环) 
             1, 新建一个word文档, 输入如下类容: 
                
             2, 将该word文件另存为xml格式(注意是另存为,不是直接改扩展名) 
             3, 将xml文件的扩展名直接改为ftl 
             4, 用java代码完成导出(需要导入freemarker.jar) 

    Java代码:

    @Test
        public void test(){
            Map<String,Object> dataMap = new HashMap<String, Object>();
            try {
                //编号
                dataMap.put("id", "123456");
                //日期
                dataMap.put("date", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse("2018-09-19")));
                //附件张数
                dataMap.put("number", 1);
                //受款人
                dataMap.put("payee", "张三");
                //付款用途
                dataMap.put("use_of_payment", "test");
                //大写金额
                dataMap.put("capitalization_amount", MoneyUtils.change(100.20));
                //小写金额
                dataMap.put("lowercase_amount", "100");
                //Configuration 用于读取ftl文件
                Configuration configuration = new Configuration(new Version("2.3.0"));
                configuration.setDefaultEncoding("utf-8");
    
                /**
                 * 以下是两种指定ftl文件所在目录路径的方式,注意这两种方式都是
                 * 指定ftl文件所在目录的路径,而不是ftl文件的路径
                 */
                //指定路径的第一种方式(根据某个类的相对路径指定)
    //                configuration.setClassForTemplateLoading(this.getClass(), "");
    
                //指定路径的第二种方式,我的路径是C:/a.ftl
                configuration.setDirectoryForTemplateLoading(new File("c:/"));
    
                //输出文档路径及名称
                File outFile = new File("D:/报销信息导出.doc");
    
                //以utf-8的编码读取ftl文件
                Template template = configuration.getTemplate("报销信息导出.ftl", "utf-8");
                Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
                template.process(dataMap, out);
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    注意:我使用的 freemarker 版本为2.3.28,Configuration对象不推荐直接new Configuration(),仔细看Configuration.class文件会发现,推荐的是 Configuration(Version incompatibleImprovements) 这个构造方法,具体这个构造方法里面传的就是Version版本类,而且版本号不能低于2.3.0

     

     


          5, 这时在D盘下就生成了一个test.word, 打开可以看到${xxx}已被替换  



             二, word文件中导入图片 
              1, 新建一个word文档, 在要插入图片的地方随便插入一张图片 
     
              2, 将word另存为xml 
              3, 将xml扩展名改为ftl 
              4, 打开ftl文件, 搜索w:binData 或者 png可以快速定位图片的位置,图片 已经编码成0-Z的字符串了, 如下: 


              5, 将上述0-Z的字符串全部删掉,写上${imgStr}(变量名随便写)后保存 
              6, 导入图片的代码与上述代码是一样的, 也是创建一个Map, 将数据存到map中,只不过我们要把图片用代码进行编码,将其也编成0-Z的字符串: 

    Map<String,String> dataMap = new HashMap<String,String>();  
     dataMap.put("imgStr", getImageStr());  
      
    //....其余省略 

     



    这是对图片进行编码的代码: 

         public String getImageStr() {  
                     String imgFile = "d:/aa.png";  
                     InputStream in = null;  
                     byte[] data = null;  
                     try {  
                         in = new FileInputStream(imgFile);  
                         data = new byte[in.available()];  
                         in.read(data);  
                         in.close();  
                     } catch (Exception e) {  
                         e.printStackTrace();  
                     }  
                     BASE64Encoder encoder = new BASE64Encoder();  
                     return encoder.encode(data);  
                 }  

     


    注意: 该代码需要用到 sun.misc.BASE64Encoder 类,这个类就是JDK中的类,但在eclipse中默认是不访问的,需要设置一下,设置方式: 
    项目上右键-->Build Path-->Configure Build Path... 

     
    双击Access rules,点击add, 选择Accessible,下方输入**, OK , 这样就可以访问sun.misc.BASE64Encoder 类了 


       三, 导出循环的表格 
          1, 新建一个word文档, 插入如下表格: 
           
     
           2, 另存为xml, 将扩展名改为ftl 
           3, 搜索  w:tr 可以找到行的起点与结束点(注意第一对w:tr 是表头,应找第二对 w:tr), 如图: 
          
     
                 

           4, 用<#list userList as user> </#list>标签将第二对 w:tr 标签包围起来(userList是集合的key, user是集合中的每个元素, 类似<c:forEach items='userList' var='user'>), 如图: 
         
     
           5, 解析该ftl文件 

    这是User类 

         public class User {  
            private String a;  
            private String b;  
            private String c;  
        //生成set和get方法,此处省略  
        }  



    这是解析ftl文件的代码,跟上面一样,只是Map的value是一个集合而已 

         @Test  
           public void exportListWord() throws Exception{  
               //构造数据  
               Map<String,List> dataMap = new HashMap<String,List>();  
               List<User> list = new ArrayList<User>();  
                 for(int i=0;i<10;i++){  
                     User user = new User();  
                     user.setA("a"+(i+1));  
                     user.setB("b"+(i+1));  
                     user.setC("c"+(i+1));  
                     list.add(user);  
                 }  
                 dataMap.put("userList", list);  
                   
                 Configuration configuration = new Configuration();  
                 configuration.setDefaultEncoding("utf-8");  
                 configuration.setDirectoryForTemplateLoading(new File("C:/"));  
                 File outFile = new File("D:/test.doc");  
                 Template t =  configuration.getTemplate("c.ftl","utf-8");  
                 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"),10240);  
                 t.process(dataMap, out);  
                 out.close();  
           }  


    如果你需要输出集合的索引, 用${user_index}即可. 

    四, 常见问题解决方案 
    4.1, 异常信息如下:

         freemarker.core.ParseException: Encountered "<" at line 3, column 28888 in test.ftl.  
        Was expecting one of:  
            <STRING_LITERAL> ...  
            <RAW_STRING> ...  
            "false" ...  
            "true" ...  
            <INTEGER> ...  
            <DECIMAL> ...  
            "." ...  
            "+" ...  
            "-" ...  
            "!" ...  
            "[" ...  
            "(" ...  



      这是由于在写${xxx}表达式的时候, xxx与其前方的文字样式不一致, 在另存为xml后你可以搜索一下 "${" , 会发现如下图这种情况: 

     

    由于${xxx}中的xxx格式与其前方的文字不一致, 那么在生成xml时,就会有一些修饰xxx样式的标签,例如修饰xxx的字体,颜色等的标签, 所以在word中看似写的是${xxx}实际上转为xml后变成了${<w:color ...>xxx</w:color>},这样这个el表达式中的标签就解析不了报错了, 可以去掉${}内部的标签只留下xxx或者删掉 "${" 和 "}"然后给xxx加上el表达式都可以解决此问题. 

       五, javaWeb中利用response导出(注意编码问题,防止中文乱码) 

         Map<String,String> dataMap = new HashMap<String,String>();  
                  dataMap.put("username", "张三");  
                  dataMap.put("sex", "男");  
                    
                  Configuration configuration = new Configuration();  
                  configuration.setDefaultEncoding("utf-8");  
                  configuration.setDirectoryForTemplateLoading(new File(request.getRealPath("/")+"/templete"));//指定ftl所在目录,根据自己的改  
                  response.setContentType("application/msword");     
                  response.setHeader("Content-Disposition", "attachment;filename=\"" + new String("文件名.doc".getBytes("GBK"), "iso8859-1") + "\"");  
                  response.setCharacterEncoding("utf-8");//此句非常关键,不然word文档全是乱码  
                  PrintWriter out = response.getWriter();  
                 Template t =  configuration.getTemplate("test.ftl","utf-8");//以utf-8的编码读取ftl文件  
                 t.process(dataMap, out);  
                 out.close();  

     

    展开全文
  • 使用poi生成word文档(最全例子)

    万次阅读 热门讨论 2018-07-31 16:32:23
    1.说明 平时的项目中,我们可能需要做大量的报告。而这些报告中,有些是固定的格式,...这篇博客主要是带领大家学习一下,如何用poi技术来实现生成word报告。 2.设计 我们知道,poi的技术可以做出word、Excel、...
  • java生成word文档

    千次阅读 2019-05-15 15:30:20
    最近工作需要从数据库查询数据,代码生成word文档,便在网上查询了一下办法。之前类似的工作也曾经做过,当时是在word模板中设置标记,在代码中填充标记。当前网络上简便的方法也是类似,word文档不是凭空生成的,...
  • 设计了一个Word文档批量生成小工具软件

    万次阅读 多人点赞 2019-08-24 10:52:41
    最近,因工作需要开发了一个文档自动生成的小工具软件,即批量替换Word文档模板中设定标签为指定的内容。Word文档模板为事先已经排版好的报表、公文等文件,但留下部分内容需要更改,将该内容设定为一个标签(如...
  • js将HTML导出生成word文档

    万次阅读 热门讨论 2018-12-07 16:05:31
    在项目开发中中,遇到将HTML导出生成word文档,刚开始在网上找了很多资料,基本都是jQuery中的插件jquery.wordexport.js,刚开始是不想用这个的,这个要引用另一个插件FileSaver.js;但是没有找到更好的方法,所以在...
  • html导出 word文档教程

    万次阅读 多人点赞 2019-07-25 10:23:57
    最近搞项目 需要用到导出word 文档,由于呢 他要显示word格式,我就 用word文档生成模板,现在 分享给大家。 这是我在网上找的 demo,按照 功能 不错大家可以看看 1、加入两个外部js FileSaver.js /* ...
  • Java Web项目中使用Freemarker生成Word文档

    万次阅读 多人点赞 2014-09-21 15:42:43
    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样只要将需要填入的...
  • Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要求是服务器上的图片(只给出服务器图片...
  • 利用freemarker导出word文档

    千次阅读 2018-11-04 21:36:18
    今天我们来利用freemarker来完成通过使用模板来生成word文件,经测试该文件并不能由WPS打开,打开的话会显现乱码 1.首先我们先来创建一个工具类 import java.io.File; import java.io.FileInputStream; import java....
  • java根据提供word模板导出word文档

    千次阅读 2019-10-17 14:49:50
    (1)首先修改word模板如下形式,把需要查询写入word的值用${}形式封装 (2)把word改为ftl格式 首先word另存为选择xml 然后重命名直接将XML文件修改后缀名为ftl文件 (3)关键代码 public void ...
  • Java生成导出word文档,操作word文档

    千次阅读 2019-04-24 17:47:48
    word文档作为办公的重要文件格式,有时候我们会需要我们的java程序直接将计算得到的结果生成word文档,方便取用,这里我们使用第三方包iText来实现 1、首先在Eclipse上新建一个Java工程,我取名为Java2Word,本经验只...
  • Java POI 生成Word文档

    万次阅读 多人点赞 2018-10-18 13:50:35
    在开发中有时候我们需要导出MS word文档。最近因为需要做一个生成word文件的功能。就将这块拿出来和大家分享。  生成word文件和我们写word文档是相同的概念,只不过在这里我们换成了用代码来操作。下面的例子中...
  • mysql数据库,生成Word文档,表结构,含注释,简单,易用
  • 用PowerDesigner自动生成数据库的表结构的方法,很实用哦~
  • 网页内容生成word文档

    2020-07-30 23:33:06
    在asp.net中使用xslt将xml数据生成word文档
  • Java 生成Word文档 — 简单示例

    千次阅读 热门讨论 2019-04-16 15:38:01
    这篇文章将介绍如何使用免费Java Word组件Free Spire.Doc for Java在Java应用程序中生成Word文档,插入文本,并设置段落的字体格式、对齐方式以及段后间距等。 Free Spire.Doc for Java概述 Free Spire.Doc for ...
1 2 3 4 5 ... 20
收藏数 112,632
精华内容 45,052
关键字:

生成word文档