加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 使用OpenOffice :: OODoc传输表样式

发布时间:2020-12-15 21:25:46 所属栏目:大数据 来源:网络整理
导读:我试图将一个表格的格式从一个OpenOffice Writer文件复制到另一个…我可以告诉我写的风格的名称到第二个文档,但不是样式数据。 我怀疑这与odfContainer的“styles”部分有关,但我不清楚如何写到第二个文档,特别是因为当我在调试器中检查$ style对象时,它
我试图将一个表格的格式从一个OpenOffice Writer文件复制到另一个…我可以告诉我写的风格的名称到第二个文档,但不是样式数据。

我怀疑这与odfContainer的“styles”部分有关,但我不清楚如何写到第二个文档,特别是因为当我在调试器中检查$ 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) );

# Create table in $doc2
my $newtable=$doc2->appendTable('newtable',1,'table-style' => $doc->getStyle($table) );

# Set style of first cell in $newtable to 'Table1.A1'
$doc2->cellStyle( $newtable,'Table1.A1' );

# Write 'doc2.odt' to disk
$container2->save;

我加载’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'

我知道属性匹配我想要复制,我也从实验知道,’getStyle’方法返回style :: name属性…我只是不知道如何从设置风格: :name属性使用cellStyle方法实际将底层数据写入新文档。

编辑:

解压缩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的样式

对输入文件的’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;

运行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中的单元格样式。

解决方法

你做了原始导入。文档的说“记住,导入实际上不是由OODoc :: File直到保存,导入的数据因此不是立即可用。我建议你试试$ container2-> save;然后在导入样式之后重新加载它,然后查看在下一次保存后是否在doc2.odt的content.xml中显示Table.A1:
# 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,'Table1.A1' );

# Write 'doc2.odt' to disk
$container2->save;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读