2017-07-04 3 views
1

概要:(10 10より大きい)大きなワードテーブルでOffice.js Wordがアドインを:大きなテーブル内の更新値とパフォーマンスの問題

  • 更新値は非常に遅いです。 パフォーマンスは、テーブルのサイズが指数関数的に悪化します。
  • 私はmyTable.values = arrNewValuesを使用しています。私も試しました myTable.addRows("end", rows, arrNewValues)。ここで、arrNewValuesは 2D配列です。
  • また、getOoxml()と のinsertOoxml()を使って更新を試みましたが、他の問題が発生しました。 解決できましたが、パフォーマンスは良いです。
  • "ScreenUpdating"によってパフォーマンスが低下しているようです(同じ問題がVBAに存在し、ScreenUpdating = falseで解決されます)。 ScreenUpdatingを一時的に無効にする機能を追加することが非常に重要と考えています。
  • テーブル更新のパフォーマンスを改善する別の方法はありますか?

背景:

マイアドイン(https://analysisplace.com/Solutions/Document-Automation)は、文書の自動化(Word文書の様々なアップデートの内容)を行います。多くの顧客は、大規模な表のテキストを更新できるようにしたいと考えています。いくつかの文書には、数十のテーブル(付録)があります。私は、これらのドキュメントの更新がテーブル更新のために許容できないほど遅い(1分以上)という問題にぶつかりました。テーブルのサイズによって

更新時間:10のカラムによって

  • 2行:0.33秒
  • 10列で4行:0.52秒
  • 10本のカラムによる8行:1.5秒
  • 16行×10列:5.5秒
  • 32行10列20.8秒
  • 64行10列88秒

コード(スクリプトラボ)Office.jsサンプル:

function updateTableCells() { 
    Word.run(function (context) { 
     var arrValues = context.document.body.tables.getFirst().load("values"); 
     return context.sync().then(
      function() { 
       var rows = arrValues.values.length; 
       var cols = arrValues.values[0].length; 
       console.log(getTimeElapsed() + "rows " + rows + "cols " + cols); 
       var arrNewValues = []; 
       for (var row = 0; row < rows; row++) { 
        arrNewValues[row] = []; 
        for (var col = 0; col < cols; col++) { 
         arrNewValues[row][col] = 'r' + row + ':c' + col; 
        } 
       } 
       console.log(getTimeElapsed() + 'Before setValues ') ; 
       context.document.body.tables.getFirst().values = arrNewValues; 
       return context.sync().then(
        function() { 
         console.log(getTimeElapsed() + "Done"); 
       }); 
      }); 
    }) 
     .catch(OfficeHelpers.Utilities.log); 
} 

サンプルWordのVBAコード:

VBAのパフォーマンスが偽ScreenUpdating =なしOffice.js性能に似ています。 ScreenUpdating = Falseの場合、パフォーマンスは即座に向上します。パフォーマンスの低下を説明する

Sub PopulateTable() 
    Application.ScreenUpdating = False 
    Dim nrRow As Long, nrCol As Long 
    Dim tbl As Word.Table 
    Set tbl = ThisDocument.Tables(1) 
    For nrRow = 1 To 32 
     For nrCol = 1 To 10 
      tbl.Cell(nrRow, nrCol).Range.Text = "c" & nrRow & ":" & nrCol 
     Next nrCol 
    Next nrRow 
End Sub 

記事:参照「テーブルを自動化するとパフォーマンスの向上」:Office.jsには「偽ScreenUpdating =」がない示すhttps://msdn.microsoft.com/en-us/library/aa537149(v=office.11).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3

投稿:私たちは「勝ったようScreenUpdating Office-js taskpaneEquivalent to Application.ScreenUpdating Property in office-js Excel add-in の音すぐにそれを見てください。getOoxml()とinsertOoxml()経由で更新テーブルに関連

投稿:Word Office.js: issues with updating tables in ContentControls using getOoxml() and insertOoxml()

答えて

1

これはおそらく、あなたが探している答えではないですが、私はソフトウェアの検証のためにある追加の単語で取り組んできましたまた、ほとんどの書式変更で500〜1000行を更新することについて話しています。

とにかく私が助けてくれたことは、テーブルを変更する前にドキュメント内の他の場所をスクロールすることでした。それを見ているだけで、10-20倍も遅くなります。それは常に瞬間ではなく、近くにあります。

+0

私のテストでは、テーブルが表示されない場合、更新時間が約30%短縮されます。しかしあなたのアイデアに基づいて、「コンテンツに合わせて自動的にサイズを変更する」がチェックされていないと、更新時間が80%短縮されることも発見しました。したがって、32x10テーブルの場合、21秒から1.7秒に短縮できます。このオプションは、TableTools>レイアウト>プロパティ>テーブル>オプションで設定します。残念ながら、Office.jsを使用してオフにする方法はないので、ユーザーが手動でオフにする必要があります。 –

+0

実際のお客様のドキュメントを更新するほど、あなたは正しいことが分かります。 Office.jsは、大きな表が表示されていないドキュメントの上部にある場合、大量のドキュメントを許容範囲内で高速に更新できます。私が文書の終わりにいる場合(たとえテーブルがなくても)、かなり遅くなります。 –

関連する問題