3

概要:

私はそれが長い読書であることを知っています。documentation要約すると、列にないすべての言語の名前、プレフィックス、およびすべての値が必要です。また、各ラベルがどの言語に属しているかを保存する必要もあります。

私の問題は次のとおりです。

データを読み取り、それを適切な列に保持します-主に空の値がある場合、すべてがスローされます。上記の Excel の例では、空白の日本語ラベルに対して、次のコードが実際に列に移動gl-pltします。label

for(int t=0; t<labelLinkValues.Count; t+=labelLinkCol.Count) {

    for(int j=0; j<labelLinkCol.Count; j++) {
        if(labelLinkCol[j].Value=="prefix")
            Response.Write(labelLinkValues[t+j].Value+"<br/>");

        if(labelLinkCol[j].Value=="name")
            Response.Write(labelLinkValues[t+j].Value+"<br/>");

        for(int p=0; p<langList.Count; p++) {
            if(j>=langList[p].start&&j<=langList[p].end)
                if(labelLinkCol[j].Value!="documentation"&&labelLinkValues[j].Value!="")
                    Response.Write(langList[p].languageValue+"---"+labelLinkValues[t+j].Value+"<br/>");
        }

    }

    Response.Write("----<br>");
}

一部始終:

Excel でエクスポートされた XML ファイルを Linq で読み込もうとしています。データを取得することはできますが、列を適切な行セルに揃えることができません。

コードを投稿する前に、いくつか言及する必要があります。このプログラムは、任意の数のファイルを読み取るように設計されており、複数の言語が含まれている場合があります(2 行目)。この特定の例では、2 つの言語がありますが、将来的には 1 つの言語、3 つの言語が存在する可能性があります。たとえば、言語は次のように定義されます。

<Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="ColumnHead2" ss:Index="4" ss:MergeAcross="1">
        <ss:Data ss:Type="String">en</ss:Data>
    </Cell>

    <Cell ss:StyleID="ColumnHead2" ss:MergeAcross="1">
        <ss:Data ss:Type="String">ja</ss:Data>
    </Cell>
</Row>

最初の言語のインデックス属性は、それがどこから始まるかを示し、マージ全体は、それが何列にまたがるかを示します。後続の言語には、各言語が後で何列にまたがるかを示す値のマージのみが含まれます。

まず、2 行のサンプル データのスクリーンショットを次に示します。

(ダウンロードした画像の方が解像度が高いです) ここに画像の説明を入力

最初の行に対応する XML コードは次のとおりです。

<Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="NoBorderNumberCell">
        <ss:Data ss:Type="Number">1</ss:Data>
    </Cell>

    <Cell ss:StyleID="NoBorderCell">
        <ss:Data ss:Type="String">gl-cor</ss:Data>
    </Cell>

    <Cell ss:StyleID="NoBorderCell">
        <ss:Data ss:Type="String">account</ss:Data>
    </Cell>

    <Cell ss:StyleID="NoBorderCell">
        <ss:Data ss:Type="String">Tuple: parent container for account numbers and identifiers. No entry is made here, but each detail line may have multiple accounts assigned to it for reporting in different GAAPs, offsetting accounts in Japan</ss:Data>
    </Cell>

    <Cell ss:StyleID="NoBorderCell">
        <ss:Data ss:Type="String">Account Identifier</ss:Data>
    </Cell>

    <Cell ss:StyleID="NoBorderCell">
        <ss:Data ss:Type="String">タプル。勘定科目番号と識別子&lt;/ss:Data>
    </Cell>

    <Cell ss:StyleID="NoBorderCell"/>

    <Cell ss:StyleID="NoBorderCell">
        <ss:Data ss:Type="String">gl-plt</ss:Data>
    </Cell>
</Row>

特定の XML ファイルから抽出する必要がある値は 3 つあります。

言語の一部ではなく、常に存在する名前と接頭辞を取得することは問題ではありません。

言語列の下にある値で、documentation. したがって、列を無視するdocumentation必要があります。

上記を読むためのコードは次のとおりです。

XElement xdocument=XElement.Load(fpath);
XNamespace ns="urn:schemas-microsoft-com:office:spreadsheet";
XNamespace docProperties="urn:schemas-microsoft-com:office:office";
XNamespace ss="urn:schemas-microsoft-com:office:spreadsheet";
XNamespace search="ss";

var labelLinkCol=(
    from worksheets in xdocument.Elements(ns+"Worksheet")
    where (string)worksheets.Attribute(ss+"Name")=="Label Link"
    from columnHead in worksheets.Descendants(ns+"Cell")
    where (string)columnHead.Attribute(ss+"StyleID")=="ColumnHead"
    select columnHead
    ).ToList();

var langValues=(
    from worksheets in xdocument.Elements(ns+"Worksheet")
    where (string)worksheets.Attribute(ss+"Name")=="Label Link"
    from columnHead in worksheets.Descendants(ns+"Cell")
    where (string)columnHead.Attribute(ss+"StyleID")=="ColumnHead2"
    select columnHead
    ).ToList();

var labelLinkValues=(
    from worksheets in xdocument.Elements(ns+"Worksheet")
    where (string)worksheets.Attribute(ss+"Name")=="Label Link"
    from columnHead in worksheets.Descendants(ns+"Cell")
    where
        (string)columnHead.Attribute(ss+"StyleID")!="ColumnHead"
        &&
        (string)columnHead.Attribute(ss+"StyleID")!="ColumnHead2"
        &&
        (string)columnHead.Attribute(ss+"StyleID")!="ColumnHead2BL"
    select columnHead
    ).ToList();

int index=0;
List<language> langList=new List<language>();

for(int j=0; j<langValues.Count; j++) {
    language languageXML=new language();

    //the first value has the index
    if(j==0) {
        index=Convert.ToInt32(langValues[j].Attribute(ss+"Index").Value);
        languageXML.index=index;
        languageXML.start=index;
        languageXML.end=index+Convert.ToInt32(langValues[j].Attribute(ss+"MergeAcross").Value);
        languageXML.languageValue=langValues[j].Value;
    }
    else {
        //get the value of when the first language begins
        languageXML.index=index;

        //to get the beginning, get the end of the previous location and add 1
        languageXML.start=langList[langList.Count-1].end+1;

        //to get the last column, add the merge to the beginning
        languageXML.end=languageXML.start+Convert.ToInt32(langValues[j].Attribute(ss+"MergeAcross").Value);
        languageXML.languageValue=langValues[j].Value;
    }

    langList.Add(languageXML);
    //Response.Write(languageXML.start + "--" + languageXML.end + "--" + languageXML.languageValue + "<br>");
}

language最初の言語の列、現在の言語の開始列、および現在の言語の終了列を含む単純なクラスです。

上記のコードは正しいと思います。すべての値を読み取り、各言語の開始位置と終了位置を正しく識別します。問題は、投稿の冒頭で説明したとおりです。

4

1 に答える 1

0

あなたがそれを必要以上に複雑にしているように私には見えます。私は最近、クリップボードを介してXMLスプレッドシートとして読み取られているExcelからデータをコピーし、それをパーサーに送信して表形式に変換する必要があるプロジェクトに取り組んでいます。

XMLスプレッドシートリファレンスは非常に貴重であることがわかりました:http://msdn.microsoft.com/en-us/library/office/aa140066(v = office.10).aspx

注意すべきことの1つであり、問​​題の原因はss:Indexがゼロベースではないことです(列1 =インデックス1)。

行とそのセルをループし、セルのインデックスを追跡するのと同じくらい簡単なはずです。必要なセルに子データ要素があるかどうかを確認することもできます。

于 2013-03-02T17:49:53.073 に答える