使用OpenOffice :: OODoc传输表格样式
我试图将表格的格式从一个OpenOffice Writer文件复制到另一个…我可以告诉我正在将样式的名称写入第二个文档,而不是样式数据。
我怀疑这与odfContainer
的'styles'
部分有关,但我不清楚如何将其写入第二个文档,尤其是因为当我在debugging器中检查$style
对象时,似乎与$doc
对象完全相同,后者据说已经加载了'content'
部分。
这是我到目前为止…
#! /usr/bin/perl use warnings; use strict; use OpenOffice::OODoc; my $file='mytest.odt'; my $outfile='doc2.odt'; # load input file my $container = odfContainer("$file"); $container->raw_export("styles.xml"); my $doc = odfDocument ( container => $container, part => 'content' ); my $style = odfDocument ( container => $container, part => 'styles' ); # load output file my $container2 = odfContainer( $outfile, create => 'text' ); $container2->raw_import("styles.xml"); my $doc2 = odfDocument ( container => $container2, part => 'content' ); # Load table from 'mytest.odt' my $table=$doc->getTable(0); # Get style from first cell in $table my $headerstyle=$doc->getStyle( $doc->getCell($table, 0, 0) ); # Create table in $doc2 my $newtable=$doc2->appendTable('newtable', 1, 1, 'table-style' => $doc->getStyle($table) ); # Set style of first cell in $newtable to 'Table1.A1' $doc2->cellStyle( $newtable, 0, 0, 'Table1.A1' ); # Write 'doc2.odt' to disk $container2->save;
我作为单元格样式加载'Table1.A1'
的原因是我在debugging器内部检查时在$table
内部发现了以下内容:
'next_sibling' => OpenOffice::OODoc::Element=HASH(0x102029250) 'att' => HASH(0x102029180) 'style:family' => 'table-cell' 'style:name' => 'Table1.A1' 'empty' => 0 'first_child' => OpenOffice::OODoc::Element=HASH(0x1020294a0) 'att' => HASH(0x102029200) 'fo:background-color' => '#cccccc' 'fo:border' => '0.0069in solid #000000' 'fo:padding-bottom' => '0in' 'fo:padding-left' => '0.075in' 'fo:padding-right' => '0.075in' 'fo:padding-top' => '0in' 'style:vertical-align' => 'top' 'style:writing-mode' => 'lr-tb'
我知道属性匹配我试图复制,我也从实验中知道'getStyle'
方法返回style::name
属性…我只是不知道如何从设置style::name
得到style::name
使用cellStyle
方法的style::name
属性实际上将底层数据写入到新文档中。
编辑:
解压OpenOffice文件,我得到了几个XML文件:
- 的settings.xml
- styles.xml
- content.xml文件
等等
OdfContainer
的'styles'
和'content'
部分对应于styles.xml和content.xml。 Styles.xml有点像一个css文件,包含ODF文件的各种标题级别的样式信息。 Content.xml也包含样式信息,就像HTML文档中的CSS头一样。
这里是从odt文件中提取的content.xml的样式部分(实际上是一个很像它…我没有保存原来的)。
<?xml version="1.0" encoding="utf-8"?> <office:document-content> ... <office:automatic-styles> <style:style style:name="Table6" style:family="table" style:master-page-name="First_20_Page"> <style:table-properties style:width="6.9208in" style:page-number="auto" table:align="left" style:writing-mode="lr-tb" /> </style:style> <style:style style:name="Table6.A" style:family="table-column"> <style:table-column-properties style:column-width="1.2729in" /> </style:style> <style:style style:name="Table6.B" style:family="table-column"> <style:table-column-properties style:column-width="3.2604in" /> </style:style> <style:style style:name="Table6.C" style:family="table-column"> <style:table-column-properties style:column-width="2.3875in" /> </style:style> <style:style style:name="Table6.1" style:family="table-row"> <style:table-row-properties style:min-row-height="0.1597in" style:keep-together="true" fo:keep-together="auto" /> </style:style> <style:style style:name="Table6.A1" style:family="table-cell"> <style:table-cell-properties style:vertical-align="bottom" fo:background-color="#cccccc" fo:padding-left="0.075in" fo:padding-right="0.075in" fo:padding-top="0in" fo:padding-bottom="0in" fo:border-left="0.0069in solid #000000" fo:border-right="none" fo:border-top="0.0069in solid #000000" fo:border-bottom="0.0069in solid #000000" style:writing-mode="lr-tb"> <style:background-image /> </style:table-cell-properties> </style:style> ...
- style:name =“Table6”描述了当前表的样式,
- style:name =“Table6.A”描述了这个表的A列的样式,
- style:name =“Table6.A1”描述单元格A1的样式
对input文件的“content.xml”部分进行原始输出,然后输出文件中的原始input将数据从一个文件传输到另一个文件。
#! /usr/local/bin/perl use warnings; use strict; use OpenOffice::OODoc; my $infile=$ARGV[0]; my $outfile='outfile.odt'; my $incontainer = odfContainer( $infile ); $incontainer->raw_export("content.xml"); my $outcontainer = odfContainer( $outfile, create => 'text' ); $outcontainer->raw_import("content.xml"); $outcontainer->save;
运行oodoc.pl infile.odt
,然后解压缩outfile.odt并检查content.xml确实显示样式已成功传输:
<style:style style:name="Table1" style:family="table"> <style:table-properties style:width="6.925in" table:align="margins" /> </style:style> <style:style style:name="Table1.A" style:family="table-column"> <style:table-column-properties style:column-width="2.3083in" style:rel-column-width="21845*" /> </style:style> <style:style style:name="Table1.A1" style:family="table-cell"> <style:table-cell-properties fo:background-color="#cccccc" fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="0.0007in solid #000000" fo:border-bottom="0.0007in solid #000000"> <style:background-image /> </style:table-cell-properties> </style:style>
现在已经完成了,我将需要实际加载和使用$outcontainer
的单元格样式。
你做了一个原始的import。 该文档说:“还要记住,导入实际上不是由OODoc :: File执行,直到保存,导入的数据因此不能立即可用。 我build议你试试$container2->save;
然后在导入样式之后重新加载它,然后在下次保存之后查看Table.A1是否显示在doc2.odt的content.xml中:
# load output file my $container2 = odfContainer( $outfile, create => 'text' ); $container2->raw_import("styles.xml"); # Carry out the import and reload it with the new styles. $container2->save; $container2 = odfContainer( $outfile ); my $doc2 = odfDocument ( container => $container2, part => 'content' ); # Load table from 'mytest.odt' my $table=$doc->getTable(0); # Get style from first cell in $table my $headerstyle=$doc->getStyle( $doc->getCell($table, 0, 0) ); # Create table in $doc2 my $newtable=$doc2->appendTable('newtable', 1, 1, 'table-style' => $doc->getStyle($table) ); # Set style of first cell in $newtable to 'Table1.A1' $doc2->cellStyle( $newtable, 0, 0, 'Table1.A1' ); # Write 'doc2.odt' to disk $container2->save;