Bar*_*den 35 perl openoffice.org openoffice-writer
我正在尝试将表格的格式从一个OpenOffice Writer文件复制到另一个...我可以告诉我,我正在将样式的名称写入第二个文档,而不是样式数据.
我怀疑这与'styles'部分内容有关odfContainer,但我不清楚如何将其写入第二个文档,特别是因为当我$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;
Run Code Online (Sandbox Code Playgroud)
我'Table1.A1'作为单元格样式加载的原因是我$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'
Run Code Online (Sandbox Code Playgroud)
我知道属性与我要复制的内容相匹配,而且我也从实验中知道该'getStyle'方法返回style::name属性...我只是不知道如何从style::name使用该cellStyle方法设置属性到实际具有底层写入新文件的数据.
编辑:
解压缩OpenOffice文件,我得到几个xml文件:
等等
这些'styles'和'content'部分OdfContainer对应于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>
...
Run Code Online (Sandbox Code Playgroud)
对输入文件的"content.xml"部分进行原始导出,然后输出文件中的原始导入会将数据从一个文件传输到另一个文件.
#! /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;
Run Code Online (Sandbox Code Playgroud)
运行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>
Run Code Online (Sandbox Code Playgroud)
既然已经完成了,我需要实际加载并使用单元格样式$outcontainer.
您进行了原始导入。该文档表示“还要记住,在保存之前,导入实际上并不是由 OODoc::File 执行的,因此导入的数据不会立即可用。” 我建议您尝试$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;
Run Code Online (Sandbox Code Playgroud)