概要:
私はそれが長い読書であることを知っています。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">タプル。勘定科目番号と識別子</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
最初の言語の列、現在の言語の開始列、および現在の言語の終了列を含む単純なクラスです。
上記のコードは正しいと思います。すべての値を読み取り、各言語の開始位置と終了位置を正しく識別します。問題は、投稿の冒頭で説明したとおりです。