2011-07-12 16 views
34

Bir tablonun formatını bir OpenOffice Writer dosyasından diğerine kopyalamaya çalışıyorum ... Stilin adını ikinci belgeye yazdığımı söyleyebilirim, ancak stil verisi değil.Tablo stillerini OpenOffice :: OODoc kullanarak aktarma

Bu odfContainer ait 'styles' kısmı ile bir ilgisi vardır şüpheli ama ayıklayıcısında $style nesneyi incelemek zaman, göründüğü özellikle çünkü ikinci belgeye bu yazma konusunda net değilim 'content' parçasını yüklediği varsayılan $doc nesnesine özdeş olmak. İşte

#! /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; 

Hücre tarzı olarak 'Table1.A1' yükleme ediyorum sebebi ayıklayıcıya içine teftiş ederken $table içindeki derin aşağıdaki buldum olmasıdır

... Ben şimdiye kadar bu var:

'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' 

Ben nitelikleri ben kopyalamak çalışıyorum ve ben de 'getStyle' yöntem style::name niteliğini döndüren deneylerden bildiklerini maç biliyorum ... Ben sadece ayarlamasını nasıl bilmiyorum Aslında, yeni belgeye yazılan temel verileri gerçekte kullanmak için 1 özniteliği style::name özniteliği.

Düzenleme: OpenOffice Sıkıştırılmış dosyayı çıkarttıktan

, birkaç xml dosyalarını almak:

  • settings.xml
  • styles.xml
  • content.xml

vs.

Th OdfContainer'un 'styles' ve 'content' bölümleri, styles.xml ve content.xml'ye karşılık gelir. Styles.xml, bir ODF dosyasının çeşitli üstbilgi düzeyleri için stil bilgilerini içeren bir css dosyası gibidir. Content.xml ayrıca bir html belgesindeki css başlığına benzeyen stil bilgilerini de içerir.

Burada, içerik dosyasından çıkan content.xml dosyasının stil kısmı (aslında bir tane gibi… Orijinali kaydetmedim).

<?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> 
... 
  • stili: name = "Table6.A" Bu tablonun A sütunundaki için stil açıklanır
  • stili: name = "Table6"
  • tarzı, şimdiki tablo için stil anlatılmaktadır : name = "Table6.A1" giriş dosyasının 'content.xml' bölümünün ham ihracatını yapmak A1 hücresine

için stil tarif eder, çıkış dosyasına sonra bir ham ithalat transferi verilerini yapar bir dosyadan diğerine.

#! /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; 

Sonra outfile.odt Ayıklama ve içerik teftiş, oodoc.pl infile.odt Running.xml tarzı başarıyla aktarılmış durumda olduğunu gösterir:

<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> 

Şimdi bu yapıldığını, aslında yük ve $outcontainer hücre stillerini kullanmanız gerekir.

+2

Bir perl kullanıcı değilim, ama ben PHP ve C++'da yaptım. Aslında böyle gider: Doküman al, stilleri ve eşyaları çöz, veri belgesinin hücre değerlerini yeni verilerinle değiştir, bütün paketi yeni bir pakete sar ... bitti. Stilleri değiştirmek isterseniz, sadece biraz daha karmaşık olur. Ben kişisel olarak garip restyling olayı için XML sorumluyorum, ama aynı zamanda XML mantıksal değil, basit olduğunu biliyorum. Neyse ... umarım sana bir ipucu verdim. Kodlamayı kendiniz yapmanız gerekecek. –

cevap

1

Ham bir ithalat yaptınız. Bunun için doktorlar "İthalatın aslında OODoc :: File tarafından gerçekte kaydedilmediğini ve bu sayede içe aktarılan verilerin hemen elde edilemediğini unutmayın." Ben Kaydetmek $container2->save; denemek ve ardından bir sonraki vuruşunun ardından stilleri içe aktarıldıktan sonra yeniden yüklemek ve ardından Table.A1 doc2.odt en content.xml içinde görünüp görünmediğini kontrol önermek:

# 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; 
+0

Hmm. Bu çok ilginç bir yaklaşım. Stil bilgisi aslında content.xml dosyasındadır (adlandırılmış stiller ve varsayılan stiller styles.xml dosyasında tutulur, 'otomatik' stiller content.xml'ye aittir). Bunu söyledikten sonra, bunu bir atış yapacağım ve ne olduğunu göreceğim ... –

+0

Hata ayıklayıcıda 'newtabletable'ı denetledim ve orijinal tabloda mevcut olan stil bilgilerini görmedim. Bunun çözmeyi denediğim sorunun çaresi olduğunu düşünüyorum. –

İlgili konular