2012-01-17 9 views
1

私は、XMLの販売データを使用してExcel 2007ファイルを作成しています(下記の1番目の画像を参照)。面倒なところは、それぞれ<item>要素のグラフが必要です(下の2番目の画像を参照)。最終的な製品では、この論理をvbaで.xltmテンプレート内に作成して、与えられたXMLに応じて約800個のアイテム販売テーブルを作成します。XMLマッピングの複数のExcelテーブル

(私はエクセルVBAとそのクエリテーブル/ワークブック接続でたくさん働いてきたが、私はそう私と一緒にクマインポートデータのXML側に新たなんだ。)

私の最初の考えはXMLマップを使用していました。私は同じ要素マッピングを複数回複製することができますが、特定の<item name"x">要素(すべてVBA経由)にマップすることを望んでいましたが、オプションではないように見えます(VBAの隠し機能?)。

<item>ではなく、別のアイテム名(たとえば、<item1><item2>など)を使用することができるため、それぞれのアイテムは別にマップする独自の要素です。これは少しハッキーだろうか?私はXMLの世界で初めてです。これは、これが整形式であると考えられるようには聞こえません。私の目標は、さまざまなレポート作成目的で「ビットサイズのチャート」を生成するという同じ概念を使用することです。そのため、わかりやすいプロセスを探していきたいと考えています。

私の唯一の選択肢は、各チャートがそれ自身の要素タグであるハッキーなXMLマッピング(下の3番目の画像を参照)を持っていると思われ、何らかの方法で繰り返し、各要素のチャートをVBAでシートに配置します。 (800のマッピングがExcelのパフォーマンスを実行するかどうか不明)

何かアドバイスをいただければ幸いです。私はこれがExcelのパワーユーザーの一般的な必要性だと思うだろうが、私はこのコンセプトに関する情報を見つけるのが難しい。このコンセプトが他の方法(例:クエリテーブルなど)で可能な場合、私はどのソリューションにも対応しています。表形式のレポートではなく、このビジュアルスタイルのレポートにはXMLが最適です。

メソッドに合うように再構成が必要な場合に備えて、ソースXMLスキーマを完全に制御できます。また、すべてのデータ/書式設定は、例のためにダムダウンされています。

レポート形式例:XMLデータ形式の
desc1

スニペット:
desc2

ハックXMLマッピング方法
desc3

答えて

0

私はこのようなものを使って複数のシートを複数のシートと同様にシートに作成しました。

  var data = Collection1; 
      var data1 = Collection2; 
      var name = "sheet name"; 

      const int left = 1; 
      const int top = 3; 
      int height = data.GetLength(0); 
      int width = data.GetLength(1); 
      int bottom = top + height - 1; 
      int right = left + width - 1; 

      var exxapp = new Microsoft.Office.Interop.Excel.Application(); 
      Workbook xlWorkBook = exxapp.Workbooks.Add(Missing.Value); 
      var xlWorkSheet = (Worksheet)xlWorkBook.Sheets.Item[1]; 
      xlWorkSheet.Name = "sheet name"; 
      exxapp.ScreenUpdating = false; 
      if (height == 0 || width == 0) 
       return; 
      dynamic rgtitle = xlWorkSheet.Range[xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[1, 1]]; 
      rgtitle.Value = "Table Heading :- " + name; 
      rgtitle.EntireColumn.AutoFit(); 

      dynamic rg = xlWorkSheet.Range[xlWorkSheet.Cells[top, left], xlWorkSheet.Cells[bottom, right]]; 
      rg.Value = data; 
      // Set borders 
      for (int i = 1; i <= 4; i++) 
       rg.Borders[i].LineStyle = 1; 
      // Set auto columns width 
      rg.EntireColumn.AutoFit(); 
      // Set header view 
      dynamic rgHeader = xlWorkSheet.Range[xlWorkSheet.Cells[top, left], xlWorkSheet.Cells[top, right]]; 
      rgHeader.Font.Bold = true; 
      rgHeader.Interior.Color = 189 * (int)Math.Pow(16, 4) + 129 * (int)Math.Pow(16, 2) + 78; // #4E81BD 
      const int left1 = 1; 
      const int top1 = 1; 
      int height1 = data1.GetLength(0); 
      int width1 = data1.GetLength(1); 
      int bottom1 = top1 + height1 - 1; 
      int right1 = left1 + width1 - 1; 

      xlWorkSheet = (Worksheet)xlWorkBook.Sheets.Item[2]; 
      xlWorkSheet.Name = "second sheet name"; 
      exxapp.ScreenUpdating = false; 
      if (height1 == 0 || width1 == 0) 
       return; 
      dynamic rg1 = xlWorkSheet.Range[xlWorkSheet.Cells[top1, left1], xlWorkSheet.Cells[bottom1, right1]]; 
      rg1.Value = data1; 
      // Set borders 
      for (int i = 1; i <= 4; i++) 
       rg1.Borders[i].LineStyle = 1; 

      // Set auto columns width 
      rg1.EntireColumn.AutoFit(); 

      // Set header view 
      dynamic rgHeader1 = xlWorkSheet.Range[xlWorkSheet.Cells[top1, left1], xlWorkSheet.Cells[top1, right1]]; 
      rgHeader1.Font.Bold = true; 
      rgHeader1.Interior.Color = 189 * (int)Math.Pow(16, 4) + 129 * (int)Math.Pow(16, 2) + 78; // #4E81BD 

      // Show excel app 
      exxapp.ScreenUpdating = true; 
      exxapp.Visible = true; 


      Marshal.ReleaseComObject(rg); 
      Marshal.ReleaseComObject(rgHeader); 
      Marshal.ReleaseComObject(rg1); 
      Marshal.ReleaseComObject(rgHeader1); 
      Marshal.ReleaseComObject(xlWorkSheet); 
      Marshal.ReleaseComObject(xlWorkBook); 
      Marshal.ReleaseComObject(exxapp); 

      GC.Collect(); 
関連する問題