ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ODFDOM for Java:简化文档及其数据的程序控制

ODFDOM for Java:简化文档及其数据的程序控制

原创 Linux操作系统 作者:genusBIT 时间:2010-06-23 15:19:07 0 删除 编辑

转自 http://www.ibm.com/developerworks/cn/lotus/symphony-odfdom-pt3/index.html

使用 ODFDOM 来创建文本、电子表格和演示图形文档

首先,我们简要描述一下 ODF 文档结构。ODF 文档保存在一个 ZIP 压缩包中,它包含 content.xml、style.xml 及其他若干文档。

Content.xml 用来保存文档内容,style.xml 用来保存文档样式信息。content.xml 文件也含有一些样式信息,可以用来自动创建一些默认值,如字体和颜色。

一般来说,操作一个 ODF 文档分四步:

  1. 加载已有 ODF 文档或创建 ODF 文档。
  2. 向 ODF 文档插入内容。
  3. 为信息的不同部分设置样式。
  4. 保存文档。

ODFDOM 现在提供一些 API,借助它们,可以轻松完成这四步主要操作。


创建文本文件

在本小节中,我们将演示一个简单用例:读取一个 XML 文件并输出到 ODF 文档。

作为文本文件,content.xml 层级如下(见清单 1):

  • 第一个元素是 ,它是文档根目录的子元素。
  • 下一级是 元素,它表示所有要保存在输出文档中的文档元素。
  • 在 之前的 是文档根目录的另一个子元素,用于保存元素的各种样式信息。

清单 1. 文本文件 content.xml 级的结构

    
      
         
      

				

此处, 和 都定义了一些样式,但有些区别。 通常用来定义常用样式。一般通过设置样式名称来应用 中定义的样式。从 ODF 编辑器的角度来看, 中定义的样式是由用户定义的一组特征值。

另一方面, 中定义的样式包含一些特别的样式属性。从 ODF 编辑器的角度看,它用于编辑对象的某些属性。

ODFDOM 提供对象来表示各种文档的 ODF 包:

  • OdfTextDocument textDocument:对应于一个文本文件(odt)对象。
  • OdfFileDom contentDom:对应于 content.xml 的 XML 文档对象。
  • OdfFileDom stylesDom:对应于 styles.xml 的 XML 文档对象。

文本文件对象可以使用 API 来获取内容对象(content.xml)和样式对象(styles.xml):

  • OdfFileDom contentDom = textDocument.getContentDom()
  • OdfFileDom stylesDom = textDocument.getStylesDom()

ODFDOM 还提供多个对象来表示各种内容和样式元素:

  • OdfOfficeAutomaticStyles contentAutoStyles:对应 content.xml 中 。
  • OdfOfficeStyles stylesOfficeStyles:对应 styles.xml 中 。
  • OdfOfficeText officeText:对应 content.xml 中 。

用 ODFDOM API 获取内容元素对象和文本元素对象也很容易:

  • OdfOfficeAutomaticStyles autoStyles = textDocument.getContentDom (). GetAutomaticStyles ()
  • OdfOfficeStyles styles = textDocument.getDocumentStyles ();
  • OdfOfficeText text = (OfficeText) textDocument.getContentRoot ();

ODFDOM 还提供一个 API 来对 ODF 文档进行文件级操作,例如,可以用来创建文本文件、加载已有文件以及保存文件:

  • OdfTextDocument dtDoc = OdfTextDocument.newTextDocument (); / / 创建文本文件
  • OdfTextDocument dtDoc = (OdfTextDocument) OdfDocument.loadDocument ( "text.odt"); / / 加载已有文本文件
  • odtDoc.save ( "text.odt") / / 保存文件

当然,文本文件没有丰富的样式属性也不行,如文本字体、段落布局、项目符号。因此,ODFDOM 也有处理这些样式属性的方法:

  • OdfStyle. style. = odtDoc.getDocumentStyles (). getStyle. ( "myStyle",
    OdfStyleFamily.Paragraph);
    / / 从文本文件获取用户定义的样式(style)对象
  • style.setProperty (OdfStyleTextProperties.FontWeight, "bold");
    / / 将样式设置为特定属性值

设置文本样式属性的代码如清单 2 所示。



OdfTextParagraph para; 
para.setProperty (OdfStyleTextProperties.FontSize, "17pt"); 
para.setProperty (OdfStyleParagraphProperties.TextAlign, "left"); 
para.setProperty (OdfStyleChartProperties.DataLabelNumber, "value"); 
					

使用特征值的代码可以应用到特定文档元素,这种方式产生的样式是 。

我们介绍了文本文件及 API 的重要用法。在下面的例子中,我们将看一个 ODFDOM 应用程序,它从 XML 文件中读出数据,然后通过 ODFDOM API 操作,数据以特定格式保存到 ODF 文本文档中(见清单 3-7)。



 
      The ODFDOM tutorial </ title> 
     <author> IBM ODF team </ author> 
     <content> introduce ODFDOM usage </ content> 
</ book>
				</PRE></TD></TR></TBODY></TABLE><BR><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="4" sizcache="2">
<TBODY sizset="4" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>DocumentBuilder builder = null; 
  inputDocument = null; 
  try ( 
      inputXPath = XPathFactory.newInstance (). newXPath (); 
      builder = DocumentBuilderFactory.newInstance (). newDocumentBuilder (); 
      inputDocument = builder.parse ( "book.xml"); 
  ) catch (IOException e) ( 
      System.err.println ( "Unable to read input file."); 
      System.err.println (e.getMessage ()); 
  ) catch (Exception e) ( 
      System.err.println ( "Unable to parse input file."); 
      System.err.println (e.getMessage ()); 
)
				</PRE></TD></TR></TBODY></TABLE><BR><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="5" sizcache="2">
<TBODY sizset="5" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>try ( 
     OdfTextDocument dtDocument = OdfTextDocument.newTextDocument (); 
     OdfFileDom contentDom = outputDocument.getContentDom (); 
     OdfFileDom stylesDom = outputDocument.getStylesDom (); 
     contentAutoStyles = contentDom.getOrCreateAutomaticStyles (); 
     OdfOfficeStyles stylesOfficeStyles = odtDocument.getOrCreateDocumentStyles (); 
     fficeText = outputDocument.getContentRoot (); 
     ) catch (Exception e) ( 
     System.err.println ( "Unable to create output file."); 
     System.err.println (e.getMessage ()); 
     dtDocument = null; 
) 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>由于内容和样式需要额外信息来补充完整,必须向这个新文本文件的内容 DOM 树插入内容元素,并向内容和样式 DOM 树插入自动样式元素(见清单 6 和 7)。 </P><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="6" sizcache="2">
<TBODY sizset="6" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>NodeList booklist = inputDocument.getElementsByTagName ( "book"); 
Node book = booklist [0]; 
String title = inputXPath.evaluate ( "book / title", book); 
String author = inputXPath.evaluate ( "book / author", book); 
String content = inputXPath.evaluate ( "book / content", book); 
OdfTextHeading heading = (OdfHeading) officeText.newTextHElement (title); 
(OdfTextParagraph) para = (OdfTextParagraph) newTextPElement (); 
para. addContent (content);
				</PRE></TD></TR></TBODY></TABLE><BR><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="7" sizcache="2">
<TBODY sizset="7" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>OdfStyle. style1 = odtDocument.getOrCreateDocumentStyles (). 
NewStyle. ( "hStyle", OdfStyleFamily.Text); 
style.setProperty (OdfTextProperties.FontWeight, "bold"); 
style.setProperty (OdfTextProperties.FontStyle, "italic"); 
style.setProperty (OdfTextProperties.FontSize, "16"); 
heading.setStyleName ( "hStyle"); 

OdfStyle. style2 = odtDocument.getOrCreateDocumentStyles (). 
NewStyle. ( "pStyle", OdfStyleFamily.Text); 
style.setProperty (OdfTextProperties.FontStyle, "italic"); 
style.setProperty (OdfTextProperties.FontSize, "10"); 
para.setStyleName ( "pStyle"); 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>最后,保存 ODT 文本文件:</P><FONT face=新宋体 size=2>odtDocument.save ( "text.odt") </FONT>
<P>可以使用 OpenOffice 或 IBM® Lotus® Symphony™ 来打开新文件,并看到 ODFDOM 如何通过直接访问 API 产生结果。</P>
<DIV class=ibm-alternate-rule>
<HR>
</DIV>
<P class="ibm-ind-link ibm-back-to-top"><A class=ibm-anchor-up-link href="http://www.ibm.com/developerworks/cn/lotus/symphony-odfdom-pt3/index.html#ibm-pcon"><FONT color=#996699><STRONG>回页首</STRONG></FONT></A></P>
<P><A name=N10176><SPAN class=atitle><STRONG><FONT size=5>创建电子表格文件</FONT></STRONG></SPAN></A></P>
<P>首先,我们看一下电子表格文档的 content.xml 的主要结构(见清单 8)。</P><BR><A name=N1017F><B><FONT size=2>清单 8. 电子表格 content.xml 的结构</FONT></B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="8" sizcache="2">
<TBODY sizset="8" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode><office:document-content> 
<office :automatic-style/> 
<office :body> 
    <office:spreadsheet> 
        <table:table/> 
    </ Office: spreadsheet> 
</ office: body> 
</ Office: document-content> 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>电子表格文档中,主要元素有:</P>
<UL>
<LI><table:table> 是表的根元素,表内容的所有元素都是它的子元素 
<LI><table:column> 指定电子表格的宽度,是默认的样式定义 
<LI><table:row> 表示表格行,由多个 <table:cell> 元素组成 </LI></UL>
<P>对于 <table:cell> 元素,两个属性 office:value-type 和 office: value,通常必须用子元素 <text:p> 指定。</P>
<P>ODFDOM 有很多与文件相关的对象:</P>
<TABLE class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="" border=0 sizset="9" sizcache="2">
<TBODY sizset="9" sizcache="1">
<TR>
<TH class=tb-row scope=row>OdfSpreadsheetDocument</TH>
<TD>content.xml</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfTable </TH>
<TD><table:table></TD></TR>
<TR>
<TH class=tb-row scope=row>OdfTableColumn</TH>
<TD><table:table-column></TD></TR>
<TR>
<TH class=tb-row scope=row>OdfTableRow</TH>
<TD><table:table-row></TD></TR>
<TR>
<TH class=tb-row scope=row>OdfTableCell</TH>
<TD><table:tabl广告></TD></TR></TBODY></TABLE>
<P>其中:</P>
<UL>
<LI>OdfTable 对象表示电子表格的表。 
<LI>OdfTableColumn 用来指定电子表格的列,列数通过 TableNumberColumnsRepeatedAttribute 属性值设置。 
<LI>OdfTableRow 用来表示表格行。一行由一个或多个 OdfTableCell 对象组成。 
<LI>OdfTableCell 是组成表格元素的单元,每个单元格对象可以用来放值、段落和其他文本内容;通常需要设置三个属性值:<BR>
<UL>
<LI>OfficeValueAttribute 
<LI>OfficeValueTypeAttribute 
<LI>TextContent </LI></UL></LI></UL>
<P>OfficeValueTypeAttribute 用来指定保存数据的类型(字符、数字、日期、时间、公式等);OfficeValueAttribute 用来保存值;TextContent 用来保存用户看到的值。 </P>
<P>现在创建一个三行四列的表格来演示如何对表特性使用 ODFDOM API 操作(见清单 9):</P>
<OL>
<LI>创建 OdfSpreadsheetDocument 电子表格对象。 
<LI>得到 OdfOfficeSpreadsheet 根。 
<LI>创建 OdfTable 对象。 
<LI>创建 <table:column> 元素,设置 table:number-columns-repeated 属性为表中列数。 
<LI>使用循环为每一行创建 <table:row> 元素。 
<LI>使用循环为每行中的单元格创建 <table:cell> 元素,并填入值。 
<LI>保存电子表格。 </LI></OL><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="14" sizcache="2">
<TBODY sizset="14" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>int data [][]= ((1,2,3,4), (5,6,7,8), (9,10,11,12)); 
OdfSpreadsheetDocument dfdoc = OdfSpreadsheetDocument.newSpreadsheetDocument (); 
OdfOfficeSpreadsheet spreadsheet = odfdoc.getContentRoot (); 
OdfTable table = (OdfTable) spreadsheet.newTableTableElement (); 
OdfTableColumn column = (OdfTableColumn) table.newTableTableColumnElement (); 
column.setTableNumberColumnsRepeatedAttribute (new Integer (4)); 
for (int i = 0; i <3; i) ( 
OdfTableRow row = (OdfTableRow) table.newTableTableRowElement (); 
/ / row.setStyleName ( "ro1"); 
for (int j = 0; j <4; j) ( 
OdfTableCell cell = (OdfTableCell) row.newTableTableCellElement (); 
cell.setOfficeValueAttribute (new Double (data [i] [j])); 
cell.setOfficeValueTypeAttribute ( "float"); 
cell.setTextContent ((new Double (data [i] [j]). toString ())); 
) 
) Odfdoc.save (ResourceUtilities.createTestResource ( "table3R4C.ods")); 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>表特性经常包含日期和时间值,这些值的表示在各国家和地区会不一样。ODFDOM 不仅提供合适的方法来设置日期和时间格式,还有一些特别的类用于这种格式。 </P>
<P>例如,OdfNumberDateStyle. 用于处理日期格式,OdfNumberTimeStyle. 用来处理时间格式,OdfNumberStyle. 用来处理数字格式。</P>
<P>这些样式元素可以放在 <office:automatic-styles> 元素下(见清单 10),如下所示:</P>
<OL>
<LI>用 getStylesDom () 取得 OdfAutomaticStyles 对象。 
<LI>创建对应类的对象。 
<LI>设置样式对象的具体格式。 </LI></OL><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="15" sizcache="2">
<TBODY sizset="15" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>OdfOfficeAutomaticStyles autoStyles = odfdoc.getStylesDom (). GetAutomaticStyles (); 
OdfNumberDateStyle. dataStyle. = (OdfNumberDateStyle) 
autoStyles.newNumberDateStyleElement ( "numberDateStyle"); 
dataStyle.buildFromFormat ( "yyyy-MM-dd"); 
OdfNumberTimeStyle. timeStyle. = (OdfNumberTimeStyle) 
autoStyles.newNumberTimeStyleElement ( "numberTimeStyle"); 
timeStyle.buildFromFormat ( "hh: mm: ss"); 
OdfNumberStyle. numberStyle. = (OdfNumberStyle) 
autoStyles.newNumberNumberStyleElement ( "numberStyle"); 
numberStyle.buildFromFormat ( "# 0.00"); 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>然后指定单元格样式,然后将其和数字样式对象关联到单元格样式对象(见清单 11): </P>
<OL>
<LI>创建 OdfStyle. 对象,它的层次是表单元格。 
<LI>用 getStyleNameAttribute () 取得日期和数字样式名。 
<LI>用 setStyleDataStyleNameAttribute() 设置日期和数字样式名为单元格样式对象的 style.:data-stylename 属性。 
<LI>将单元格样式应用到具体的单元格。 </LI></OL><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="16" sizcache="2">
<TBODY sizset="16" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode><STRONG>Cell style. for date cells:</STRONG>

OdfStyle. style; 
style. = autoStyles.newStyle. (OdfStyleFamily.TableCell); 
String dataCellStyleName = style.getStyleNameAttribute (); 
style.setStyleDataStyleNameAttribute ( "numberDateStyle"); 
cell.setStyleName (dataCellStyleName); 

<STRONG>And for time cells:</STRONG>

style. = autoStyles.newStyle. (OdfStyleFamily.TableCell); 
String timeCellStyleName = style.getStyleNameAttribute (); 
style.setStyleDataStyleNameAttribute ( "numberTimeStyle"); 
cell.setStyleName (timeCellStyleName); 

<STRONG>And for the temperatures:</STRONG>

style. = autoStyles.newStyle. (OdfStyleFamily.TableCell); 
String numberCellStyleName = style.getStyleNameAttribute (); 
style.setStyleDataStyleNameAttribute ( "numberStyle"); 
cell.setStyleName (numberCellStyleNam); 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>本例中,创建了一个简单的电子表格,但实际上,电子表格可能会相当复杂。例如,可能有跨行和跨列的单元格,以及大量样式和嵌入对象和媒体的应用程序。 </P>
<P>这些复杂的特性可以通过 ODFDOM API 实现,尽管代码会很复杂。但随着 ODFDOM 发展,这些复杂的电子表格的创建会变得越来越简单。 </P>
<DIV class=ibm-alternate-rule>
<HR>
</DIV>
<P class="ibm-ind-link ibm-back-to-top"><A class=ibm-anchor-up-link href="http://www.ibm.com/developerworks/cn/lotus/symphony-odfdom-pt3/index.html#ibm-pcon"><FONT color=#996699><STRONG>回页首</STRONG></FONT></A></P>
<P><A name=N10270><SPAN class=atitle><STRONG><FONT size=5>创建演示文件</FONT></STRONG></SPAN></A></P>
<P>让我们从定义演示 content.xml 中的相关术语开始(见清单 12):</P>
<UL>
<LI><office:presentation> 电子演示文档的根元素。 
<LI><draw:page> 是 <office:presentation> 的子元素,表示一张幻灯片。只有图像元素才能保存在 <draw:page> 中,因此文本元素,如 <text:title>,必须先放在 <draw:frame> 下,然后才能放到幻灯片中。 
<LI><style.:master-page> 是一个通用模板页,是 <style.:master-style>. Styles 的子元素,例如背景,在母版页中设置,每张幻灯片都可关联到一个母版页;从而,可对其应用对应的模板。 </LI></UL><BR><A name=N10285><B><FONT size=2>清单 12. 演示文件 content.xml 的结构</FONT></B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="17" sizcache="2">
<TBODY sizset="17" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode><office:document-content> 
<office :automatic-style/> 
<office :body> 
    <office:presentation> 
       <draw:page/> 
    </ office: presentation> 
</ office: body> 
</ Office: document-content> 
				</PRE></TD></TR></TBODY></TABLE><BR>
<P>在本小节中,我们将展示如何创建演示文件、插入幻灯片、列出标题、应用母版页模板,还有保存新幻灯片。 </P>
<P>表 1 列举出代码中用到的 ODF 类。</P><BR><A name=table1><B><FONT size=2>表 1. ODF 类和用途</FONT></B></A><BR>
<TABLE class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table using a heading tag for the caption, all columns left-aligned" border=0 sizset="18" sizcache="2">
<TBODY sizset="18" sizcache="1">
<TR>
<TH scope=col>ODF 类</TH>
<TH scope=col>用途</TH></TR>
<TR>
<TH class=tb-row scope=row>OdfPresentationDocument</TH>
<TD>演示文件</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfStyleDom</TH>
<TD>Style. DOM</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfOfficePresentation</TH>
<TD><office:presentation> 元素</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfOfficeStyles</TH>
<TD><office:styles> 文档样式元素</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfOfficeAutomaticStyle</TH>
<TD><style.:automatic-styles> 放在自动样式中</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfStylePageLayout </TH>
<TD><style.:page-layout> 定义页面布局</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfOfficeMasterStyles</TH>
<TD><office:master-styles> 定义页面的母版样式</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfStyleMasterPage</TH>
<TD><style.:master-page> 是 <office:master-styles> 子元素,用于定义主样式母版页</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfDrawPage</TH>
<TD><draw:page> 元素用于表示一个演示页面或一张幻灯片</TD></TR>
<TR>
<TH class=tb-row scope=row>OdfDrawFrame</TH>
<TD><draw:frame> 是一个容器元素,其他元素放置其中</TD></TR></TBODY></TABLE>
<P>步骤如下(见清单 13):</P>
<OL>
<LI>创建 OdfPresentationDocument 对象。 
<LI>获取 OdfOfficePresentation 对象。 
<LI>获取 OdfOfficeStyles 对象,它表示文档样式元素;如果该元素不存在,就创建一个。 
<LI>创建 <style.:page-layout> 元素;该元素在 OdfOfficeAutomaticStyle. 元素下,因此可以使用 getAutomaticStyles () 得到。 
<LI>使用 OdfPresentationDocument 类的 getOfficeMasterStyles() 方法获取 OdfOfficeMasterStyles 对象。 
<LI>创建 OdfStyleMasterPage 对象,其中我们必须指定母版页名称和布局样式名称。(可以使用第 4 步中的布局样式名称。) 
<LI>演示文档由多个幻灯片组成,所以下一步是用 newDrawPageElement 方法(MasterPageStyleName)创建 OdfDrawPage 对象,这里我们可以指定母版页。调用该方法后,母版页就应用到新幻灯片。 
<LI>由于只有图形元素能保存到 <draw:page> 中,因此我们需要创建 OdfDrawFrame. 对象来添加内容。 
<LI>我们创建两个 OdfDrawFrame. 对象。一个用来保存标题; 另一个用来保存图片。 </LI></OL>
<P>至此,演示文档已创建完成,现在可以保存为 ODP 文档,并使用 OpenOffice 或 IBM Lotus Symphony 打开。</P><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 sizset="29" sizcache="2">
<TBODY sizset="29" sizcache="1">
<TR>
<TD class=code-outline><PRE class=displaycode>OdfPresentationDocument presentationDoc = 
OdfPresentationDocument.newPresentationDocument (); 
OdfOfficePresentation presentation1 = presentationDoc.getContentRoot (); 
presentationDoc.getOrCreateDocumentStyles (); 
presentationDoc.getStylesDom (). getAutomaticStyles (). 
newStylePageLayoutElement ( "PM01"); 
OdfOfficeMasterStyles fficeMasterStyles = presentationDoc.getOfficeMasterStyles (); 
                                                            
    OdfStyleMasterPage masterPage = (OdfStyleMasterPage) officeMasterStyles.
    newStyleMasterPageElement ( "master-name-1", "PM01"); 
    OdfDrawPage page4 = (OdfDrawPage) presentation1.newDrawPageElement 
    ( "master-name-1"); 
    OdfDrawFrame. frame1 = (OdfDrawFrame) page4.newDrawFrameElement (); 
    frame1.newDrawTextBoxElement (). setTextContent ( "title"); 
    OdfDrawFrame. frame2 = (OdfDrawFrame) page4.newDrawFrameElement (); 
    frame2.newDrawImageElement (). setXlinkHrefAttribute ( "http://impage"); 
    presentationDoc.save ( "presentation.odp"); 
				</PRE></TD></TR></TBODY></TABLE><BR>
<DIV class=ibm-alternate-rule>
<HR>
</DIV>
<P class="ibm-ind-link ibm-back-to-top"><A class=ibm-anchor-up-link href="http://www.ibm.com/developerworks/cn/lotus/symphony-odfdom-pt3/index.html#ibm-pcon"><FONT color=#996699><STRONG>回页首</STRONG></FONT></A></P>
<P><A name=N1034A><SPAN class=atitle><STRONG><FONT size=5>结束语</FONT></STRONG></SPAN></A></P>
<P>在对本文中三个例子的详细讲解中,我们演示了如何使用 ODFDOM API 来创建文本、电子表格、演示 ODF 文档的内容、样式、以及其他特性。</P>
                                                    </div>
                                        <p style="clear:both;"></p>
                    
                    <p class="translate">
                                                    来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14751907/viewspace-665978/
                            ,如需转载,请注明出处,否则将追究法律责任。
                                            </p>
<!--
                    
                    
                                      -->
                </div>
            </div>
                            <div class="preview-footer clearfix">
                    <!--已点赞、收藏-->
                    <div class="icon-praise" id="praise" onclick="blogObj.praise($(this),'/praise/')"><span
                                class="text"></span><span class="num">0</span></div>
                    <div class="icon-collect" id="collect" onclick="blogObj.praise($(this),'/favour/')"><span
                                class="text"></span><span class="num">0</span></div>
                    <div class="share-group fr">
                        <div class="bdsharebuttonbox bdshare-button-style0-16" data-bd-bind="1522216707615">
                            <span class="fl">分享到:</span>
                            <a href="javascript:;" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
                            <a href="javascript:;" class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a>
                            <a href="javascript:;" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a>
                            <a href="javascript:;" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a>
                        </div>

                        <script>
                            window._bd_share_config = {
                                "common": {
                                    "bdSnsKey": {},
                                    "bdText": "",
                                    "bdDesc": "",
                                    "bdMini": "",
                                    "bdMiniList": false,
                                    "bdPic": "",
                                    "bdStyle": "0",
                                    "bdSize": "32"
                                }, "share": {"bdSize": 16}
                            };
                            with (document)
                                0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = '/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];
                            if ($(window).width() < 1320) {
                                if ($(window).width() < 1200) {
                                    $(".sideslip").css({
                                        "left": "20px",
                                        "margin-left": 0
                                    })
                                } else {
                                    $(".sideslip").css({
                                        "margin-left": "-590px"
                                    })
                                }
                            }</script>
                    </div>

                </div>

                <div class="article-context">
                    <div class="fl">
                        <span class="color77">上一篇:</span>
                                                    <a href="https://blog.itpub.net/14751907/viewspace-665645/">IBM Lotus Sametime V8.5 工具包介绍</a>
                        
                    </div>
                    <div class="fr">
                        <span class="color77">下一篇:</span>
                                                    <a href="https://blog.itpub.net/14751907/viewspace-665979/">在 IBM WebSphere Portal 中整合 IBM Lotus Quickr 协作功能</a>
                                            </div>
                </div>

                <input type="hidden" id="blogId"   name="blogId"  value="665978">


                <!--评论开始-->
                <div class="blog-comment">
                    <div class="new-comment">
                        <input type="hidden" id="hid" name="hid" value="665978">
                        <input type="hidden" name="_token" value="QaxtM1Oqla8RRyWnzeEJ5jzWWBt8gEqKuwYYlCDQ">
                        <a class="avatar" href="javascript:;">
                            <img src="/images/user_pic_default.png"></a>
                        <!--用户未登录-->

                        <div class="sign-container">
                            <span>请登录后发表评论</span>
                            <a class="btn btn-sign">
                                <a class="layui-btn ml30" onclick="blog.login(event)">登录</a>
                            </a>
                        </div>

                        <!--用户已登录-->
                        <textarea placeholder="请写下你的评论…" onfocus="blogObj.textareaFocus($(this),200)"
                                  maxlength=200></textarea>


                    </div>
                    <div class="comment-list">
                        <div class="top-title"><span class="all-comment">全部评论</span> <span
                                    class="colorbb ml20"></span>
                        </div>
                        <div class="comment-items" id="comment_items">
                            <script type="text/template" id='blog_template'>
                                <%for(var i=0;i
                                <items.length;i++){%>
                                <div class="comment-item">
                                    <div class="author">
                                        <a target="_blank" href="/<%=items[i].uid%>" class="avatar">
                                            <img src="<%=items[i].headimg%>" alt="">

                                        </a>
                                        <div class="info">
                                            <div class="name"><a target="_blank" href="/<%=items[i].uid%>"><%=items[i].username%></a>
                                                <span class="fr reply-btn"
                                                      onclick="blogObj.newComment($(this),'<%=items[i].username%>',<%=items[i].id%>)">回复</span>
                                            </div>
                                            <div class="time colorbb"><%=items[i].createtime%></div>
                                        </div>
                                    </div>
                                    <p class="comment-wrap"><%=items[i].content%></p>
                                    <%if(items[i].items.items.length) { %>

                                    <div class="sub-comment-list">
                                        <%for(var j=0;j
                                        <items
                                        [i].items.items.length;j++){%>
                                        <div class="sub-comment">
                                            <div class="color77 time-reply">
                                                <span class="time"><%=items[i].items.items[j].createtime%></span>
                                                <span class="reply-btn fr"
                                                      onclick="blogObj.newComment($(this),'<%=items[i].items.items[j].username%>',<%=items[i].items.items[j].id%>)">回复</span>
                                            </div>
                                            <p><a href="/<%=items[i].uid%>"><%=items[i].items.items[j].username%></a>   回复   <a
                                                        href="/<%=items[i].touid%>"><%=items[i].items.items[j].tousername%></a>:
                                                <span class="content"><%=items[i].items.items[j].content%></span></p>
                                        </div>
                                        <%}%>
                                        <%if(items[i].items.total > 5) { %>
                                        <div class="more-comment"><span class="sub-comment-count">还有<i class="count"><%=items[i].items.total-5%></i>条评论</span><span
                                                    class="more-comment-btn"
                                                    onclick=blogObj.loadSubComment($(this),<%=items[i].id%>) data-count=1 data-flag=true>点击查看</span>
                                        </div>
                                        <%}%>

                                    </div>
                                    <%}%>
                                </div>
                                <%}%>
                            </script>
                        </div>

                    </div>

                </div>
                <!--评论结束-->
                    </div>
        <script>
                    </script>
        <div class="fr w290">
            <!--作者信息开始-->
            <!--作者信息开始-->
<div class="author-info right-fixed ">
        <div class="head-img">
        <a href="https://blog.itpub.net/14751907/"><img src="http://account.itpub.net/api/avatar.php?uid=14751907" alt=""></a>
    </div>
    <div class="author-name"><a href="https://blog.itpub.net/14751907/">genusBIT</a></div>
            <div class="author-intro">
        
    </div>
            <p class="register-time"><span class="color77">注册时间:</span>2008-07-04</p>
            <ul class="tree-list clearfix">
        <li>
            <div class="item-tt">博文量</div>
            <a href="https://blog.itpub.net/14751907/"><span class="item-num blognum">233</span></a>
        </li>
        <li>
            <div class="item-tt">访问量</div>
            <div class="item-num blogviewnum">483861</div>
        </li>
    </ul>

</div>
<!--作者信息结束-->

<script>
    var data = {uid: 14751907};
    $._ajax({
        url: '/getAuthorInfo/',
        data: data,
        type: 'get',
        dataType: 'json',
        success: function (data) {
            if (data.code == 200) {
                var data = data.data;
                $(".blognum").text(data.blognum);
                $(".blogviewnum").text(data.visitednum);
            }
        }
    });
</script>            <!--作者信息结束-->

                            <!--博文推荐开始-->
                <div class="blog-choice right-fixed">
                    <h3 class="choice-title">最新文章</h3>
                    <ul class="newul">
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-675775/"
                                   class="clearfix">
                                    整合Lotus Quickr 8.5 for Domino 与 IBM ECM:配置与最佳实践
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-675102/"
                                   class="clearfix">
                                    在 IBM Lotus Quickr 8.5 for WebSphere Portal 中定制主题
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-674789/"
                                   class="clearfix">
                                    Lotus Notes/Domino 环境下的 OpenSocial 开发
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-674483/"
                                   class="clearfix">
                                    IBM Lotus Quickr 8.5 for Portal 新功能和新特性简介
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-673870/"
                                   class="clearfix">
                                    使用新的 IBM Lotus Connections 2.5 迁移工具
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-673868/"
                                   class="clearfix">
                                    使用 Lotus Forms JavaScript API 与 Web 页面中的 XFDL 表单交互
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-672891/"
                                   class="clearfix">
                                    Lotus Notes Client 8.5.2 标准版安装部署新功能介绍
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-672888/"
                                   class="clearfix">
                                    IBM Lotus Symphony 七种兵器之 Widgets
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-671316/"
                                   class="clearfix">
                                    利用 LotusScript 实现用 Lotus Domino 的数据生成图形化的 Excel 报表
                                </a>
                            </li>
                                                    <li class="new-item">
                                <a href="https://blog.itpub.net/14751907/viewspace-671091/"
                                   class="clearfix">
                                    IBM Lotus 1-2-3 9.8 新特性:网络感知
                                </a>
                            </li>
                                                <ul>


                </div>
                <!--大牛精选结束-->
                    </div>
    </div>
    <div class="icon-back-top" onclick="$('html,body').animate({scrollTop:0},'slow');"></div>
    <!--main部分结束-->

    <!--百度推送-->
            <script>
            (function () {
                var bp = document.createElement('script');
                var curProtocol = window.location.protocol.split(':')[0];
                if (curProtocol === 'https') {
                    bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
                } else {
                    bp.src = 'http://push.zhanzhang.baidu.com/push.js';
                }
                var s = document.getElementsByTagName("script")[0];
                s.parentNode.insertBefore(bp, s);
            })();
        </script>
    
<!--footer部分开始-->
<div class="blog-footer">
    <div class="w1200 pr">
        <div class="footer-links">
            <a class="icon-blog icon-wx mr30">
                <div class="wx-qrcode">
                    <img src="/images/qrcode.jpg" alt="">
                </div>
            </a>
            <a href="https://weibo.com/itpub2001?from=myfollow_all" class="icon-blog icon-wb" target="_blank"></a>
        </div>
        <p class="footer-nav">
            <a href="http://www.it168.com/bottomfile/it168.shtml" target="_blank">支持我们</a>
            <a href="http://www.it168.com/bottomfile/tgzn.shtml" target="_blank">作者招募</a>
            <a href="http://www.it168.com/bottomfile/sytk.shtml" target="_blank">用户协议</a>
            <a href="//blog.itpub.net/31509949/viewspace-2157750/" target="_blank">FAQ</a>
            <a href="http://edu.itpub.net/contactus.html" target="_blank">Contact Us</a>
            <script src="https://s22.cnzz.com/z_stat.php?id=1274521965&web_id=1274521965" language="JavaScript"></script>
        </p>
        <p>北京盛拓优讯信息技术有限公司. 版权所有  <a style="color:#777777;" target="_blank" href="http://beian.miit.gov.cn">京ICP备16024965号-8</a>  北京市公安局海淀分局网监中心备案编号:11010802021510  niuxiaotong@pcpop.com  17352615567
            <a style="color:#777777;" target="_blank"  href="http://www.it168.com/jubao.html"> 未成年人举报专区</a></p>
        <p>广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员</p>
        <p>违法和不良信息举报电话:18101376593</p>
    </div>
</div>
<!--footer部分结束-->

<script>
    var _hmt = _hmt || [];
    (function() {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?5016281862f595e78ffa42f085ea0f49";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?540bee2c1a1b922df9e0a0b922440b73";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>
<!-- END STAT PV -->

</body>
</html>