xmlファイルに接続したExcel2007ファイル(OpenXML形式)があります。この接続により、Excelテーブルとピボットグラフが生成されます。
OpenXML SDK v2を使用して、Excelの[すべて更新]ボタンと同じことを行う方法を見つけようとしています。新しいxmlファイルが提供されるとすぐにファイルを自動的に更新できるようにします。
ありがとうございました。
xmlファイルに接続したExcel2007ファイル(OpenXML形式)があります。この接続により、Excelテーブルとピボットグラフが生成されます。
OpenXML SDK v2を使用して、Excelの[すべて更新]ボタンと同じことを行う方法を見つけようとしています。新しいxmlファイルが提供されるとすぐにファイルを自動的に更新できるようにします。
ありがとうございました。
これにはかなり良い回避策があります。OpenXMLを使用すると、ピボットテーブルで[ファイルを開くときにデータを更新する]オプションをオンにできます(ピボットテーブル->[ピボットテーブルオプション]->[データ]タブを右クリックします)。これにより、ユーザーが最初にスプレッドシートを開いたときにピボットテーブルが自動更新されます。コード:
using (var document = SpreadsheetDocument.Open(newFilePath, true))
{
var uriPartDictionary = BuildUriPartDictionary(document);
PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart1 = (PivotTableCacheDefinitionPart)uriPartDictionary["/xl/pivotCache/pivotCacheDefinition1.xml"];
PivotCacheDefinition pivotCacheDefinition1 = pivotTableCacheDefinitionPart1.PivotCacheDefinition;
pivotCacheDefinition1.RefreshOnLoad = true;
}
あなたはあなたのpivotCacheDefinitionへの「パス」を決定する必要があります-それを探すためにOpenXMLSDK2.0生産性ツールを使用してください。
BuildUriPartDictionaryは、OpenXMLSDK2.0生産性ツールによって生成される標準メソッドです。
protected Dictionary<String, OpenXmlPart> BuildUriPartDictionary(SpreadsheetDocument document)
{
var uriPartDictionary = new Dictionary<String, OpenXmlPart>();
var queue = new Queue<OpenXmlPartContainer>();
queue.Enqueue(document);
while (queue.Count > 0)
{
foreach (var part in queue.Dequeue().Parts.Where(part => !uriPartDictionary.Keys.Contains(part.OpenXmlPart.Uri.ToString())))
{
uriPartDictionary.Add(part.OpenXmlPart.Uri.ToString(), part.OpenXmlPart);
queue.Enqueue(part.OpenXmlPart);
}
}
return uriPartDictionary;
}
別の解決策は、スプレッドシートをマクロ対応に変換し、すべてのピボットテーブルを更新するVBAスクリプトをそこに埋め込むことです。これは、ボタンをクリックするか、ユーザーがスプレッドシートを開いたときに発生する可能性があります。ここでは、ピボットテーブルを更新するためのVBAコードを見つけることができます: http ://www.ozgrid.com/VBA/pivot-table-refresh.htm
これを行う唯一の方法は、このタイプの方法に従うことだと思います。
ThisWorkbook.PivotCaches(yourIndex).Refresh();
また
ThisWorkbook.RefreshAll();
私はRefreshAllも機能すると確信していましたが。
OpenXMLではこれを行うことはできません。Open XMLを使用すると、ファイルに保存されているデータを操作したり、データや数式、定義などを変更したりできます。実際には計算を行いません。
Excelの自動化は技術的には機能しますが、サーバー環境には絶対にお勧めできません。可能な限りデスクトップでは避けるのが最善です。
BartoszStrutyńskiが提供するソリューションは、ワークブックにピボットテーブルが含まれていて、それらが同じキャッシュを共有している場合にのみ機能します。ブックにピボットテーブルが含まれていない場合、コードは。をスローしNullPointerException
ます。ブックに異なるキャッシュを使用するピボットテーブルが含まれている場合(データソースが異なる場合)、同じキャッシュを使用するピボットテーブルの1つのグループのみが更新されます。以下は、 BartoszStrutyńskiのコードに基づくコードであり、前述の制限がなく、PivotCacheDefinitionオブジェクトの「パス」を知ることに依存していません。このコードはBuildUriPartDictionaryもインライン化します。これにより、uriPartDictionary
他の場所で使用されていない場合の列挙を回避でき、明示的な型を使用して、使用されているクラスのドキュメントを簡単に検索できます。
Dictionary<String, OpenXmlPart> uriPartDictionary = new Dictionary<String, OpenXmlPart>();
Queue<OpenXmlPartContainer> queue = new Queue<OpenXmlPartContainer>();
queue.Enqueue(document);
while (queue.Count > 0)
{
foreach (IdPartPair part in queue.Dequeue().Parts.Where(part => !uriPartDictionary.Keys.Contains(part.OpenXmlPart.Uri.ToString())))
{
uriPartDictionary.Add(part.OpenXmlPart.Uri.ToString(), part.OpenXmlPart);
queue.Enqueue(part.OpenXmlPart);
PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart;
if ((pivotTableCacheDefinitionPart = part.OpenXmlPart as PivotTableCacheDefinitionPart) != null)
{
pivotTableCacheDefinitionPart.PivotCacheDefinition.RefreshOnLoad = true;
}
}
}