2

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

よろしくお願いします。

4

2 に答える 2

2

@ ja72の提案に基づいて、彼が言及したリンクからデータを解析するのは非常に簡単です。私はC#があまり得意ではないので、C#に変換できるvb.netコードを次に示します。

そうは言っても、C#からこの問題を見ることができる多くの方法があります

方法1

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

短所

1)インターネットに接続する必要があります

2)このプロセスは遅い

ウェイ2

別のプログラムを作成してURLに移動し、以下のコードを使用して値を解析します。以下のコードを使用して、テキストファイルまたはcsvファイルへの出力を生成し、ファイルをリソースに埋め込んで、いつでも使用できるようにします。

WAY 2をお勧めしますが、最終的にはあなた次第です。:)

コード

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

スナップショット

ここに画像の説明を入力してください

:上記は、ja72によって提供された上記のリンクをスクレイプする方法の単なる例です。他のリンクを使用する場合は、それに応じてコードを変更する必要があります。また、上記のリンクに記載されている数式は、Excel2007以降のものであることに注意してください。Excel 2003の場合は、別のリンクにアクセスする必要があります。上記の例にはボタンが含まれていないSTOPため、プログラムの実行が開始されると、終了するまで停止できません。抽出を終了するためのボタンをもう1つ追加できると確信しています。

于 2012-05-02T09:30:24.497 に答える
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;
        }

    }
}
于 2012-05-02T10:54:50.003 に答える