C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: Excel(XMLスプレッドシート)の読み込み方について


(過去ログ 64 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■37063 / inTopicNo.1)  Excel(XMLスプレッドシート)の読み込み方について
  
□投稿者/ きょうこ (1回)-(2009/06/12(Fri) 12:10:24)

分類:[VB.NET/VB2005 以降] 

VB2005にて、Excelの文字を検索するプログラムを作成中です。
Excelのバージョンは2003です。

検索する文字を入力し、検索対象フォルダ以下のExcelファイルから、該当する文字を含むものを一覧表示します。
対象となるExcelファイルは1000以上になるため、レスポンスを早くしようと、XMLスプレッドシート(*.xml)形式で保存しています。

<Data ss:Type="String">入力文字</Data>
のように、"Data"タグに、セルに入力された文字列が入っているのが分かりました。
検索対象は入力された文字だけなので、

Dim doc As XmlDocument = New XmlDocument()
doc.Load(filename)
Dim list As XmlNodeList = doc.GetElementsByTagName("Data")
For Each node As XmlNode In list
    Dim strData As String = node.InnerText

<<ここで比較処理を行う>>

Next

とコーディングしていたのですが、実際に使用されるExcelデータは、
セルの中の一部に書式設定している箇所(色づけ・太字など)があり、
その部分は、

<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><B><U>あああ<Font html:Color="#FF0000">いいい</Font><Font>ううう</Font></U></B></ss:Data>

となっており、上記のコードでは、読み込まれませんでした。

書式を設定したセルのデータも読み込むには、どのようにすればよろしいでしょうか。
よろしくお願いします。

引用返信 編集キー/
■37082 / inTopicNo.2)  Re[1]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ オショウ (227回)-(2009/06/12(Fri) 13:54:16)
> 検索する文字を入力し、検索対象フォルダ以下のExcelファイルから、該当する文字を含むものを一覧表示します。
> 対象となるExcelファイルは1000以上になるため、レスポンスを早くしようと、XMLスプレッドシート(*.xml)形式で保存しています。

  エクセルの表形式で言うと、1行目からキチっとデータが入っているなら
  OleDbでXML開けるので、SQL文で検索できるかと思いますが。

  Microsoft OLE DB Simple Provider(ActiveX Data Object の場合ですが)
  http://msdn.microsoft.com/ja-jp/library/cc426809.aspx

  接続文字列をちゃんと設定すれば、.NETでも問題なくアクセスできるので
  如何?

  エクセルのままだと、それもでのOK〜
  (xlsファイルもOleDBで開けるので)
  もうXMLファイルに保存されているので、時間の無駄ね・・・

以上。参考まで
引用返信 編集キー/
■37087 / inTopicNo.3)  Re[2]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ きょうこ (3回)-(2009/06/12(Fri) 14:29:26)
ありがとうございます。

■No37082 (オショウ さん) に返信

>   エクセルの表形式で言うと、1行目からキチっとデータが入っているなら
>   OleDbでXML開けるので、SQL文で検索できるかと思いますが。

今回、検索対象としているのは、表形式のデータではなく、一般の文書の形式です。
例えば、プログラムの仕様書などのように、文章が入力されています。

その為に、SQLでの取得とは少し異なるように思っています。

今まで、通常のWindowsの検索画面を使って、Excel文書の検索を行っていたのですが、
検索文字を複数使って、AND検索やOR検索をしたいということで、プログラムを作成しています。

XmlReaderを用いて、1つずつ読み込む方法を試してますが、
ss:Data 
で始まる場合、reader.LocalNameは""となるので、どのように判断すればいいのか分かりません。

<Data ss:Type="String">入力文字</Data>
と、
<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><B><U>あああ<Font html:Color="#FF0000">いいい</Font><Font>ううう</Font></U></B></ss:Data>
を、同じように読み込める方法は、無いのでしょうか。

引用返信 編集キー/
■37094 / inTopicNo.4)  Re[3]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ オショウ (228回)-(2009/06/12(Fri) 16:06:09)
> 今回、検索対象としているのは、表形式のデータではなく、一般の文書の形式です。
> 例えば、プログラムの仕様書などのように、文章が入力されています。

  そうでしたか・・・
  では残念ながらSQL的には解決できませんネ!

> XmlReaderを用いて、1つずつ読み込む方法を試してますが、
> ss:Data
> で始まる場合、reader.LocalNameは""となるので、どのように判断すればいいのか分かりません。

  2007 Office System 使っていますが、SP2 の状態で一般文書を保存して
  XMLファイルの中身を確認しましたが、<ss:Data 〜と言う表記にはなって
  いません。

  <Data 〜となります。

  2003 Excelでも試してみますが、サービスパックは何をお使いでしょう。
  OpenXMLのパッチが出ていたかと思いますが、サービスパックの適用で、
  保存されるXMLファイルの中身が変化してしまうなら、大変かと・・・

以上。
引用返信 編集キー/
■37098 / inTopicNo.5)  Re[3]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ やじゅ (1036回)-(2009/06/12(Fri) 16:37:03)
やじゅ さんの Web サイト
No37087 (きょうこ さん) に返信
> <Data ss:Type="String">入力文字</Data>
> <ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
<B><U>あああ<Font html:Color="#FF0000">いいい</Font><Font>ううう</Font></U></B></ss:Data>
> を、同じように読み込める方法は、無いのでしょうか。

ss:Type="String" が同じだから、ss:Type="String" → id="SearchString" として一括置換してから
getElementById("SearchString")で取得するとかね。
引用返信 編集キー/
■37121 / inTopicNo.6)  Re[4]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ きょうこ (5回)-(2009/06/13(Sat) 10:57:58)
ありがとうございます。
今日は休みなので、自宅のPCでXMLファイルの確認をしています。

No37094 (オショウ さん) に返信

>   2007 Office System 使っていますが、SP2 の状態で一般文書を保存して
>   XMLファイルの中身を確認しましたが、<ss:Data 〜と言う表記にはなって
>   いません。
>
>   <Data 〜となります。

通常の入力セル欄は、<Data〜ですが、セルの一部の文字だけに、書式指定をした場合などに起こっているようです。
例)「あいうえお」の「う」だけを選択して、「B(太字)」にする。

>   2003 Excelでも試してみますが、サービスパックは何をお使いでしょう。
>   OpenXMLのパッチが出ていたかと思いますが、サービスパックの適用で、
>   保存されるXMLファイルの中身が変化してしまうなら、大変かと・・・

自宅のPCは、Excel2002(SP3)なのですが、XMLの中身は同じでした。
<Cell><ss:Data ss:Type="String" xmlns="http〜〜〜
サービスパックによるデータの変化は、他の環境で確認してみないと分かりませんね。
引用返信 編集キー/
■37123 / inTopicNo.7)  Re[4]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ きょうこ (6回)-(2009/06/13(Sat) 11:05:14)
No37098 (やじゅ さん) に返信

ありがとうございます。

> ss:Type="String" が同じだから、ss:Type="String" → id="SearchString" として一括置換してから
> getElementById("SearchString")で取得するとかね。

ファイルの中身は、常にユーザー様が作成、変更を行います。
(具体的には書けないのですが、法律に関する文書を使っている現場です。)
日を追って、新しいファイルも作成され続けるので、私共での中身の置換などは行えないと思われます。

また、Type="String"に限らず、数値セル(金額など)も検索対象にしないといけません。
ちなみに、数値セルは
<Data ss:Type="Number">
となっているので、Dataタグで取得できますね。
引用返信 編集キー/
■37124 / inTopicNo.8)  Re[5]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ やじゅ (1038回)-(2009/06/13(Sat) 11:29:20)
やじゅ さんの Web サイト
No37123 (きょうこ さん) に返信
> ファイルの中身は、常にユーザー様が作成、変更を行います。
> (具体的には書けないのですが、法律に関する文書を使っている現場です。)
> 日を追って、新しいファイルも作成され続けるので、私共での中身の置換などは行えないと思われます。
> また、Type="String"に限らず、数値セル(金額など)も検索対象にしないといけません。
> ちなみに、数値セルは
> <Data ss:Type="Number">
> となっているので、Dataタグで取得できますね。

置換するのはあくまで検索する時に、一時的に置換して内部メモリ上におくだけで、ファイルそのものを置換
して保存するという意味ではありません。
今現在、Dataタグが2種類あるわけですよね、"Data"タグと"ss:Data"と、"Data"タグだけだと"ss:Data"タグは
検索されない。なら、"ss:Data"→"Data"に文字列置換してから検索するでもいいわけです。
引用返信 編集キー/
■37128 / inTopicNo.9)  Re[6]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ きょうこ (7回)-(2009/06/13(Sat) 15:08:20)
No37124 (やじゅ さん) に返信

> 置換するのはあくまで検索する時に、一時的に置換して内部メモリ上におくだけで、ファイルそのものを置換
> して保存するという意味ではありません。
なるほど、そうですね!
一度、文字列をReplaceしたものを、Loadすればいいのですね。

月曜日に、実装してみます。
引用返信 編集キー/
■37129 / inTopicNo.10)  Re[7]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ オショウ (230回)-(2009/06/13(Sat) 17:33:53)
2009/06/13(Sat) 17:34:07 編集(投稿者)
        Dim list As XmlNodeList = doc.GetElementsByTagName("*")

        For Each node As XmlNode In list
            Select Case node.Name
                Case "Data", "ss:Data"
                    Debug.WriteLine(node.Name + "/" + node.InnerText)
            End Select
        Next

上記のようにしたら、一応欲しい部分は取れますね・・・

参考まで。

以上。

引用返信 編集キー/
■37142 / inTopicNo.11)  Re[8]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ なちゃ (296回)-(2009/06/14(Sun) 02:35:38)
Dim doc As XmlDocument = New XmlDocument()
doc.Load(filename)

Dim nav As XPathNavigator = doc.CreateNavigator()
Dim nsmgr As XmlNamespaceManager = new XmlNamespaceManager(nav.NameTable)
nsmgr.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet")
Dim list As XmlNodeList = doc.SelectNodes("//ss:Data", nsmgr)

For Each node As XmlNode In list
Dim strData As String = node.InnerText

<<ここで比較処理を行う>>

Next

こんな感じで

引用返信 編集キー/
■37143 / inTopicNo.12)  Re[9]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ なちゃ (297回)-(2009/06/14(Sun) 02:43:27)
おっと、XPathNavigatorはいらないですね、ちょっと修正。

Dim doc As XmlDocument = New XmlDocument()
doc.Load(filename)

Dim nsmgr As XmlNamespaceManager = new XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet")
Dim list As XmlNodeList = doc.SelectNodes("//ss:Data", nsmgr)

For Each node As XmlNode In list
Dim strData As String = node.InnerText

<<ここで比較処理を行う>>

Next

引用返信 編集キー/
■37148 / inTopicNo.13)  Re[8]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ やじゅ (1039回)-(2009/06/14(Sun) 12:55:26)
やじゅ さんの Web サイト
No37129 (オショウ さん) に返信
> Dim list As XmlNodeList = doc.GetElementsByTagName("*")
> 上記のようにしたら、一応欲しい部分は取れますね・・・
>

なんだ、GetElementsByTagNameってワイルドカードを使えるのか
なら、わざわざ文字列置換する必要もないね。

でも、ワイルドカード使えるからと、"*Data"ってやってみたけど駄目だった(^^;

引用返信 編集キー/
■37149 / inTopicNo.14)  Re[9]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ なちゃ (298回)-(2009/06/14(Sun) 13:09:21)
念のため書いときますが、文字列置換とか強引なやり方は避けるべきです。
まあ無いとは思いますけど、いつ動かなくなってもおかしくありません。
# そうするしかない場合は仕方ないですが

引用返信 編集キー/
■37173 / inTopicNo.15)  Re[10]: Excel(XMLスプレッドシート)の読み込み方について
□投稿者/ きょうこ (8回)-(2009/06/15(Mon) 10:43:09)
オショウ様、やじゅ様、なちゃ様。
ありがとうございました。

今回は、なちゃ様からご教授いただきましたコードにて、解決いたしました。
思っていた以上に、シンプルなコーディングで、必要な情報が取得でき、驚きました。
心配していたレスポンスも問題ないようです。

XMLについては、まだまだ初心者でしたので、皆様のコーディング例を色々と見せていただき、大変勉強になりました。
本当にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -