6

phpword を使用して MS Word ドキュメントを生成しています。生成されたファイルの最後にインデックスを生成する方法はありますか?

私がうまくいくと思う方法の 1 つは、生成された MS Word ファイルを読み取り、各単語がどこにあるか (たとえば、MS Word ファイルのページ番号) を見つけてから、別の MS Word ファイルでインデックスを再生成することです。

より良い方法はありますか?
必要なファイルの例:

A 
Animal 51,98 
Apple 11,54,99 

B
Basket 55  
...
..
etc
4

2 に答える 2

1

私はあなたが文書の見出しを読むことができたと思います:この投稿を読んでください、あなたが望むものとは正確には異なりますが、おそらく修正を加えることは正しい方法かもしれません:

見出しタグに基づいてネストされた目次を自動的に生成します

于 2012-10-07T08:40:25.737 に答える
1

正直なところ、ここには良い選択肢があまりないと思います。私にとっても興味深いので、これを少し調べましたが、これを可能にする方法に関する投稿以外に、phpwordのドキュメントやフォーラムには何も見つかりませんでした. その裏側では、docx バンドル (zip ファイル) を解凍して、XML ファイルを直接操作することができますこれがどうなるかはわかりません...仮説的には、正しく行われた場合、Wordで手動で行った場合と何ら変わりはありません。いくつかのフィラー テキストを使用して実験し、ドキュメント内の 1 つの用語のインデックスに対して手動で "Mark All" を実行しました。私が見つけることができるのは次のとおりです。

~/[Content_Types].xml の最初の子として追加します:

<Override PartName="/customXml/itemProps1.xml" ContentType="application/vnd.openxmlformats-officedocument.customXmlProperties+xml" />

~/CustomXml フォルダーを作成します -

~/CustomXml フォルダーに item1.xml を作成します。

<b:Sources SelectedStyle="\APA.XSL" StyleName="APA" xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"></b:Sources>

~/CustomXml フォルダーに itemProps1.xml を作成します。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ds:datastoreItem ds:itemID="{3DC430FE-7F6E-49D7-9EFC-E4F37E42ABA0}" xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml">
  <ds:schemaRefs>
     <ds:schemaRef ds:uri="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"/>
  </ds:schemaRefs>
</ds:datastoreItem>

~/CustomXml/_rels フォルダーを作成します。 ~/CustomXml/_rels フォルダーに item1.xml.rels を作成します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" Target="itemProps1.xml"/>
</Relationships>

~/docProps フォルダーは変更されましたが、開く/閉じるたびに単語がこれらの値を再生成/更新するため、無関係であり、ファイルの内容には関係ありません。

基本的に、これにより ~/word フォルダーが残ります。したがって、 ~/word/styles.xml を変更して、次のように末尾にインデックスのスタイルを追加します。

<w:style w:type="paragraph" w:styleId="Index1">
  <w:name w:val="index 1"/>
  <w:basedOn w:val="Normal"/>
  <w:next w:val="Normal"/>
  <w:autoRedefine/>
  <w:uiPriority w:val="99"/>
  <w:semiHidden/>
  <w:unhideWhenUsed/>
  <w:rsid w:val="00C52B35"/>
  <w:pPr>
    <w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
    <w:ind w:left="220" w:hanging="220"/>
  </w:pPr>
</w:style>

~/word/settings.xml の w:rsid 要素はすべて変更されました。正直なところ、これらは全体に散らばっていて、どのように機能するのか、計算されるのか、またはあまりにも重要なのかわかりません。

~/word/_rels/document.xml.rels で、以下が Relationships ノードの子として追加されました。

<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Target="../customXml/item1.xml"/>

最後に、そしておそらく最も重要なこととして、~/word/document.xml では、索引付けを表す用語 (「sit」) の各出現箇所の後に、次の要素が続きます。

<w:r w:rsidR="00C52B35">
  <w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r w:rsidR="00C52B35">
  <w:instrText xml:space="preserve">XE "</w:instrText>
</w:r>
<w:r w:rsidR="00C52B35" w:rsidRPr="00C90937">
  <w:instrText>sit</w:instrText>
</w:r>
<w:r w:rsidR="00C52B35">
  <w:instrText xml:space="preserve">"</w:instrText>
</w:r>
<w:r w:rsidR="00C52B35">
  <w:fldChar w:fldCharType="end"/>
</w:r>

インデックスを挿入した最後にも少しあります。

<w:p w:rsidR="00C52B35" w:rsidRDefault="00C52B35" w:rsidP="00DE5AB4">
  <w:pPr>
    <w:rPr>
      <w:b/>
      <w:noProof/>
    </w:rPr>
    <w:sectPr w:rsidR="00C52B35" w:rsidSect="00C52B35">
      <w:pgSz w:w="12240" w:h="15840"/>
      <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
      <w:cols w:space="720"/>
      <w:docGrid w:linePitch="360"/>
    </w:sectPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:b/>
    </w:rPr>
    <w:fldChar w:fldCharType="begin"/>
  </w:r>
  <w:r>
    <w:rPr>
      <w:b/>
    </w:rPr>
    <w:instrText xml:space="preserve">INDEX \c "2" \z "1033"</w:instrText>
  </w:r>
  <w:r>
    <w:rPr>
      <w:b/>
    </w:rPr>
    <w:fldChar w:fldCharType="separate"/>
  </w:r>
</w:p>
<w:p w:rsidR="00C52B35" w:rsidRDefault="00C52B35">
  <w:pPr>
    <w:rPr>
      <w:noProof/>
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:noProof/>
    </w:rPr>
    <w:lastRenderedPageBreak/>
    <w:br w:type="page"/>
  </w:r>
</w:p>
<w:p w:rsidR="00C52B35" w:rsidRDefault="00C52B35">
  <w:pPr>
    <w:pStyle w:val="Index1"/>
    <w:tabs>
      <w:tab w:val="right" w:leader="dot" w:pos="4310"/>
    </w:tabs>
    <w:rPr>
      <w:noProof/>
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:noProof/>
    </w:rPr>
    <w:lastRenderedPageBreak/>
    <w:t>sit, 1, 2</w:t>
  </w:r>
</w:p>
<w:p w:rsidR="00C52B35" w:rsidRDefault="00C52B35" w:rsidP="00DE5AB4">
  <w:pPr>
    <w:rPr>
      <w:b/>
      <w:noProof/>
    </w:rPr>
    <w:sectPr w:rsidR="00C52B35" w:rsidSect="00C52B35">
      <w:type w:val="continuous"/>
      <w:pgSz w:w="12240" w:h="15840"/>
      <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
      <w:cols w:num="2" w:space="720"/>
      <w:docGrid w:linePitch="360"/>
    </w:sectPr>
  </w:pPr>
</w:p>
<w:p w:rsidR="00371DB1" w:rsidRPr="00371DB1" w:rsidRDefault="00C52B35" w:rsidP="00DE5AB4">
  <w:pPr>
    <w:rPr>
      <w:b/>
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:b/>
    </w:rPr>
    <w:lastRenderedPageBreak/>
    <w:fldChar w:fldCharType="end"/>
  </w:r>
</w:p>

うまくいけば、これが役に立ちます。複雑なソリューションであることは承知していますが、自動化された方法で実際にこれを達成するのに役立つ唯一のものを見つけることができます. これは、これを行う公式の手動の方法よりも少し優れており、その方法で行ったインデックスの機能を保持する必要があります。WinMergeを使用してファイル間の違いを表示することをお勧めします (2 つのフォルダーを開いた後、右クリックして [Compare Special] > [XML] を使用します)。幸運を祈っています。1 回限りの場合は、弾丸を噛んで手動で行います。おそらくより高速で、頭痛の種も少なくなります。

于 2012-10-09T13:15:32.647 に答える