2012-05-01 3 views
2

さまざまなExcel式の基礎となるメタデータを抽出する方法はありますか?私はエクセル式を使用し、各式の入力引数、データ型、戻り値の型を知ることに興味があるC#でこのフレームワークを構築しています。これは、この提供されたメタデータに基づいてウィザード画面を構築するのに役立ちます。Excelの数式とメタデータ

ご協力いただきありがとうございます。

+1

申し訳ありませんが、私はそれをすることはできません。オンラインドキュメントやローカルヘルプファイルの解析を試みることはできますが、それは容易ではありません。 – ja72

+0

ワークシート関数で 'url'を見つけました:http://office.microsoft.com/client/helppreview.aspx?AssetId=HV805551279990&lcid=1033&NS=EXCEL%2EDEV&Version=12&pid=CH080555125&CTT=4 – ja72

+0

+両方に1つ:)良い質問と良い提案。 'それは簡単ではないだろう」@ ja72:それはとても簡単です:) –

答えて

2

@ ja72が示唆しているところでは、彼が言及したリンクからデータを解析するのは非常に簡単です。私ので、ここでのC#とあまりにも良いではないよあなたがC#

あなたがC#

WAY 1

からこの問題を見ることができる多くの方法がある、と述べたに変換することができますvb.netコードです

実行時にURLに移動し、以下のコードを使用して値を解析します。

デメリット

1)あなたは、インターネット接続

2を持っている必要があります)このプロセスは、2

遅い

WAYあるに独立したプログラムを作成します。 URLに移動し、下のコードを使用して値を解析します。 あなたはそれに取り組むことができるように、いつでもあなたは

をしたい、私は2WAYを示唆しているが、決定は最終的にあるテキストファイルやCSVファイルへの出力を生成し、あなたのリソースにファイルを埋め込むために以下のコードを使用しますあなた。 :)

CODE

Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     TextBox1.Clear() 
     GetFormulas() 
     MessageBox.Show ("Done!") 
    End Sub 

    Sub GetFormulas() 
     Dim wc As New Net.WebClient 
     '~~> first get links 
     Dim mainPage As String = wc.DownloadString("http://office.microsoft.com/client/helppreview.aspx?AssetId=HV805551279990&lcid=1033&NS=EXCEL.DEV&Version=12&pid=CH080555125") 
     Dim doc As mshtml.IHTMLDocument2 = New mshtml.HTMLDocument 
     doc.write (mainPage) 
     doc.close() 
     Dim table As mshtml.IHTMLElement = DirectCast(doc.getElementById("vstable"), mshtml.IHTMLElement2).getElementsByTagName("table")(0) 
     Dim links As mshtml.IHTMLElementCollection = table.getElementsByTagName("A") 
     For Each link In links 
      Dim childPage As String = wc.DownloadString(link.getAttribute("href")) 
      Dim doc2 As mshtml.IHTMLDocument2 = New mshtml.HTMLDocument 
      doc2.write (childPage) 
      doc2.close() 
      Dim div2 As mshtml.IHTMLElement2 = doc2.getElementById("m_article") 
      For Each elem As mshtml.IHTMLElement In div2.getElementsByTagName("P") 
       If elem.getAttribute("className") = "signature" Then 
        Dim formulaString As String = elem.innerText 
        TextBox1.AppendText (link.innerText & vbTab & formulaString & vbCrLf) 
       End If 
      Next 
     Next 
    End Sub 
End Class 

SNAPSHOT

enter image description here

:上記ja72によって与えられた上記のリンクをこすりする方法についての単なる一例です。他のリンクを使用する予定がある場合は、それに応じてコードを変更する必要があります。また、上記のリンクに記載されている数式は、Excel 2007以降のものです。 Excel 2003では、別のリンクを取得する必要があります。上記の例ではSTOPボタンを含めていないので、プログラムの実行が開始されると、プログラムが終了するまで停止することはできません。私はあなたが抽出を終了するためにもう一つのボタンを追加できると確信しています。

+0

+ 1素敵に完了。このスレッドを私に思い出させますhttp://stackoverflow.com/questions/8798260/html-parsing-of-cricinfo-scorecards/8846791#8846791あなたは本当にラブの解散を好きです –

+0

@PradeepKumar:LOLいいえ:)それは私がこれを見つけたことです非常に面白い質問... –

+0

+1私の提案にそのギャップを埋めるためにありがとう。 HTMLの解析は私のパンとバターではなく、コミュニティが挑戦に立ち上がり、私ができなかった答えを提供してうれしいです。 – ja72

1

@SiddharthRoutのすべてのクレジットここには、Sidが投稿したコードのC#変換があります。

C#を使用すると、実際にたくさんのキャストと変換が必要です。しかしそれがC#の仕組みです:P

using System; 
using System.Windows.Forms; 

Namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     Public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      textBox1.Clear(); 
      GetFormulas(); 
      MessageBox.Show("Done!"); 
     } 

     public void GetFormulas() 
     { 
      mshtml.HTMLDocument doc = NewHtmlDoc("http://office.microsoft.com/client/helppreview.aspx?AssetId=HV805551279990&lcid=1033&NS=EXCEL.DEV&Version=12&pid=CH080555125"); 
      mshtml.IHTMLElement2 table = (mshtml.IHTMLElement2)(mshtml.IHTMLElement2)((mshtml.IHTMLElement2)doc.getElementById("vstable")).getElementsByTagName("table").item(null, 0); 
      mshtml.IHTMLElementCollection links = table.getElementsByTagName("A"); 
      foreach (mshtml.IHTMLElement link in links) 
      { 
       mshtml.HTMLDocument doc2 = NewHtmlDoc(link.getAttribute("href",0).ToString()); 
       mshtml.IHTMLElement div2 = doc2.getElementById("m_article"); 
       foreach (mshtml.IHTMLElement elem in ((mshtml.IHTMLElement2)div2).getElementsByTagName("P")) 
       { 
        if (elem.getAttribute("className",0) != null && elem.getAttribute("className",0).ToString() == "signature") 
        { 
         string formulaString = elem.innerText; 
         textBox1.AppendText(link.innerText + "\t\t" + formulaString + "\n"); 
        } 
       } 
      } 
     } 

     private mshtml.HTMLDocument NewHtmlDoc(string url) 
     { 
      System.Net.WebClient wc = new System.Net.WebClient(); 
      string page = wc.DownloadString(url); 
      mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)(new mshtml.HTMLDocument()); 
      doc.write(page); 
      doc.close(); 
      return (mshtml.HTMLDocument)doc; 
     } 

    } 
} 
+1

+1 :)私はC#でもっと実験する必要があると思うが、第2の考えでは...ナ! :) –

+1

ところで、私は停止ボタンを追加しました;)あなたはそれを含めることができますか? ;)http://siddharthrout.wordpress.com/2012/05/02/vb-net-to-retrieve-the-names-and-arguments-of-all-excel-formulas/ –

+0

それは素晴らしいです:) –