Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
bagilevi committed May 28, 2010
0 parents commit 8003ffe
Show file tree
Hide file tree
Showing 16 changed files with 279 additions and 0 deletions.
12 changes: 12 additions & 0 deletions .gitignore
@@ -0,0 +1,12 @@
.DS_Store
log/*
tmp/**/*
*.swp
*.swo
nbproject
.project
.idea
.idea/**
*~
**/*~

45 changes: 45 additions & 0 deletions README.textile
@@ -0,0 +1,45 @@
h1. DocX Builder

_DocX Builder_ is a small utility to help you compose a docx (Microsoft Word 2007) based on a template's XML.

The @slice_template.rb@ can be used separately for non-docx applications.

The steps:
# Create a docx file with _Microsoft Word_ or _OpenOffice.org_
# Unzip it (the docx file is actually a ZIP package)
# Create your template from @word/document.xml@
# Open the template and reformat it (I used RubyMine)
# Find the parts you need to generate programmatically, and mark them up with <!-- BEGIN SOMETHING --> ... <!-- END SOMETHING -->, see @example/plan_report_template.xml@
# Remove the formatting (compact the XML)
# Create your builder, see @example.rb@

h2. The example explained

pre.
_____head______ _________area_______________________________________ _foot_
| | | |
| | ________goal________________________| |
| | | | |
| | | _______objective____| |
| | | | | |
| (Plan Name) | (Area Name) | (Goal Name) | (Objective Name) | |
_____________________________________________________________________________
XML DOCUMENT

You can assign a text to a placeholder:

pre.
template['head']['Plan Name'] = @plan.name

Or you can replace a slice with a string, that can be composed by multiplying that slice:

pre.
template['area'] =
@plan.areas.map do |area|

area_slice = template['area'].clone
area_slice['Area Name'] = area.description
area_slice['goal'] = '...'
end

See @example.rb@
38 changes: 38 additions & 0 deletions docx_builder.rb
@@ -0,0 +1,38 @@
require 'slice_template'

class DocxBuilder
def initialize(template_filename, template_dirname)
@template_filename = template_filename
@template_dirname = template_dirname
end

def build
template = SliceTemplate.new(@template_filename);
yield template
build_docx(template.render)
end

private

def build_docx(content)
docx_content = nil
in_temp_dir do |temp_dir|
system("cp -r #{@template_dirname} #{temp_dir}/plan_report")
open("#{temp_dir}/plan_report/word/document.xml", "w") do |file|
file.write(content)
end
system("cd #{temp_dir}/plan_report; zip -r ../plan_report.docx *")
docx_content = File.read("#{temp_dir}/plan_report.docx")
end
docx_content
end

def in_temp_dir
temp_dir = "/tmp/docx_#{Time.now.to_f.to_s}"
Dir.mkdir(temp_dir)
yield(temp_dir)
system("rm -Rf #{temp_dir}")
end
end


Binary file added example.docx
Binary file not shown.
56 changes: 56 additions & 0 deletions example.rb
@@ -0,0 +1,56 @@
require 'docx_builder'


plan_struct = Struct.new(:name, :areas, :goals_by_area, :objectives_by_goal)
area_struct = Struct.new(:description, :id)
goal_struct = Struct.new(:description, :id)
objective_struct = Struct.new(:description)
@plan = plan_struct.new
@plan.name = 'Business Plan for 2011'
@plan.areas = [area_struct.new('Software Development', 1), area_struct.new('Cooking', 2)]
@plan.goals_by_area = {
1 => [ goal_struct.new('Create a new app', 1), goal_struct.new('Create another app', 2)],
2 => [ goal_struct.new('Make a new recipe', 3), goal_struct.new('Open a restaurant', 4)],
}
@plan.objectives_by_goal = {
1 => [ objective_struct.new('It should be interesting'), objective_struct.new('It should be simple') ],
2 => [ objective_struct.new('It should be revolutionary'), objective_struct.new('It should be unique') ],
3 => [ objective_struct.new('Make a unique recipe'), objective_struct.new('Make a tasty recipe') ],
4 => [ objective_struct.new('Serve high quality food'), objective_struct.new('Make it cheap') ],
}


file_path = "#{File.dirname(__FILE__)}/example/plan_report_template.xml"
dir_path = "#{File.dirname(__FILE__)}/example/plan_report_template"

report = DocxBuilder.new(file_path, dir_path).build do |template|

template['head']['Plan Name'] = @plan.name
template['area'] =
@plan.areas.map do |area|

area_slice = template['area'].clone
area_slice['Area Name'] = area.description
area_slice['goal'] =
@plan.goals_by_area[area.id].map do |goal|

goal_slice = template['goal'].clone
goal_slice['Goal Name'] = goal.description
goal_slice['objective'] =
@plan.objectives_by_goal[goal.id].map do |objective|
objective_slice = template['objective'].clone
objective_slice['Objective Name'] = objective.description
objective_slice
end
goal_slice
end
area_slice
end
end


open("example.docx", "w") { |file| file.write(report) }

# ... or in a Rails controller:
# response.headers['Content-disposition'] = 'attachment; filename=plan_report.docx'
# render :text => report, :content_type => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
2 changes: 2 additions & 0 deletions example/plan_report_template.xml
@@ -0,0 +1,2 @@
<!-- BEGIN HEAD --><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"><w:body><w:p><w:pPr><w:pStyle w:val="style1"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr><w:spacing w:after="120" w:before="240"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Strategic Plan: (Plan Name)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style0"/></w:pPr><w:r><w:rPr></w:rPr></w:r></w:p><!-- END HEAD --><!-- BEGIN AREA --><w:p><w:pPr><w:pStyle w:val="style2"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Area: (Area Name)</w:t></w:r></w:p><!-- BEGIN GOAL --><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal Name)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><!-- BEGIN OBJECTIVE --><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="0" w:name="__DdeLink__0_226207805"/><w:bookmarkEnd w:id="0"/><w:r><w:rPr></w:rPr><w:t>(Objective Name)</w:t></w:r></w:p><!-- END OBJECTIVE --><!-- END GOAL --><!-- END AREA --><!-- BEGIN FOOT --><w:p><w:pPr><w:pStyle w:val="style17"/><w:spacing w:after="120" w:before="0"/></w:pPr><w:r><w:rPr></w:rPr></w:r></w:p><w:sectPr><w:formProt w:val="off"/><w:pgSz w:h="16838" w:w="11906"/><w:textDirection w:val="lrTb"/><w:pgNumType w:fmt="decimal"/><w:type w:val="nextPage"/><w:pgMar w:bottom="1134" w:left="1134" w:right="1134" w:top="1134"/></w:sectPr></w:body></w:document><!-- END FOOT -->
3 changes: 3 additions & 0 deletions example/plan_report_template/[Content_Types].xml
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Override PartName="/word/_rels/document.xml.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/><Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/><Override PartName="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
</Types>
3 changes: 3 additions & 0 deletions example/plan_report_template/_rels/.rels
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
</Relationships>
2 changes: 2 additions & 0 deletions example/plan_report_template/docProps/app.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><TotalTime>0</TotalTime></Properties>
2 changes: 2 additions & 0 deletions example/plan_report_template/docProps/core.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dcterms:created xsi:type="dcterms:W3CDTF">2010-05-28T19:47:48.00Z</dcterms:created><dc:creator>Levente Bagi</dc:creator><cp:revision>0</cp:revision></cp:coreProperties>
3 changes: 3 additions & 0 deletions example/plan_report_template/word/_rels/document.xml.rels
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/>
</Relationships>
2 changes: 2 additions & 0 deletions example/plan_report_template/word/document.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"><w:body><w:p><w:pPr><w:pStyle w:val="style1"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr><w:spacing w:after="120" w:before="240"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Strategic Plan: (Strategic Plan Name)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style0"/></w:pPr><w:r><w:rPr></w:rPr></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style2"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Area: (Area 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="0" w:name="__DdeLink__0_226207805"/><w:bookmarkEnd w:id="0"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="1" w:name="__DdeLink__0_2262078051"/><w:bookmarkEnd w:id="1"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="2" w:name="__DdeLink__0_22620780511"/><w:bookmarkEnd w:id="2"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style2"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Area: (Area 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="3" w:name="__DdeLink__0_2262078052"/><w:bookmarkEnd w:id="3"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="4" w:name="__DdeLink__0_22620780512"/><w:bookmarkEnd w:id="4"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="5" w:name="__DdeLink__0_226207805111"/><w:bookmarkEnd w:id="5"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style2"/><w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Area: (Area 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="6" w:name="__DdeLink__0_2262078053"/><w:bookmarkEnd w:id="6"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="7" w:name="__DdeLink__0_22620780513"/><w:bookmarkEnd w:id="7"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style3"/><w:numPr><w:ilvl w:val="2"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>Goal: (Goal 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/></w:pPr><w:r><w:rPr></w:rPr><w:t>Objectives:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:bookmarkStart w:id="8" w:name="__DdeLink__0_226207805112"/><w:bookmarkEnd w:id="8"/><w:r><w:rPr></w:rPr><w:t>(Objective 1)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 2)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr><w:r><w:rPr></w:rPr><w:t>(Objective 3)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style17"/><w:spacing w:after="120" w:before="0"/></w:pPr><w:r><w:rPr></w:rPr></w:r></w:p><w:sectPr><w:formProt w:val="off"/><w:pgSz w:h="16838" w:w="11906"/><w:textDirection w:val="lrTb"/><w:pgNumType w:fmt="decimal"/><w:type w:val="nextPage"/><w:pgMar w:bottom="1134" w:left="1134" w:right="1134" w:top="1134"/></w:sectPr></w:body></w:document>
2 changes: 2 additions & 0 deletions example/plan_report_template/word/fontTable.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:fonts xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:font w:name="Times New Roman"><w:charset w:val="00"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Symbol"><w:charset w:val="02"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Arial"><w:charset w:val="00"/><w:family w:val="swiss"/><w:pitch w:val="variable"/></w:font><w:font w:name="Liberation Serif"><w:altName w:val="Times New Roman"/><w:charset w:val="80"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font></w:fonts>

0 comments on commit 8003ffe

Please sign in to comment.