QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

xmlスプレッドシート形式のファイルが開けない

以前、↓の質問をしましたが、回答がいただけませんでした。

xsj形式のワークシートを開きたい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=48331&forum=7

この件は「Microsoft Excel97-Excel 2003 および5.0/95ブック(*.xls)」で
保存しなおしてファイルを取り込む、という対応をしました。

同じく、今回はxmlスプレッドシート形式のExcelファイルを開くことができません。

Excelファイルを開いて、DBにインポートする処理をしています。

ファイルの種類:XMLスプレッドシート2003(*.xml)で作成されたExcelファイルを指定すると以下のエラーが出ます。

サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT))
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Runtime.InteropServices.COMException: サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT))

ソース エラー:

xlBooks = xlApp.Workbooks
Try
xlBook = xlBooks.Open(importFile) ←ここが赤くなっています。

取り込むファイルの拡張子は「xls」なのですが、ファイルの種類が「xml」です。
一旦開いて「Microsoft Excel97-Excel 2003 および5.0/95ブック(*.xls)」で保存しなおしたファイルは正常に処理できます。

サーバーは2003Serverで、Excel2007です。
Excel2003の時はエラーになりませんでした。
ちなみに、Windows XPのクライアントマシンにIISを立てて同じようにExcel2007にした場合はエラーになりません。

今回はMicrosoft Excel 12.0 Object Libraryの参照設定を行ってみましたが、エラーになります。

同じ現象をご存じの方がいらっしゃれば教えてください。

[ メッセージ編集済み 編集者: まなか 編集日時 2009-03-02 09:32 ]

質問者:まなか

回答

XMLスプレッド形式を扱ったことがありませんが

取り込むファイルの拡張子は「xls」なのですが、ファイルの種類が「xml」です

という拡張子と中身が不一致な状態では開けないのでは?
XPの場合は拡張子xlsで開けてるんですか?

何で開発しているのか、アプリケーションの種類なども明記したほうがいいと思います。

# いずれかのバージョンのVB.NETでWebアプリかWebサービスみたいに見受けられますが。
[ メッセージ編集済み 編集者: デューン 編集日時 2009-03-02 11:03 ]

投稿者:デューン

編集 履歴 (0)

デューンさんありがとうございます。

Microsoft Visual Web Developer 2005
ASP.NETでWebアプリです。

拡張子と中身が不一致の警告メッセージが出ます。
 「開こうとしているファイル 'name.ext' の形式は、ファイル拡張子が示す形式と
  異なります。このファイルを開く前に、ファイルが破損していないこと、信頼でき
  る発行元からのファイルであることを確認してください。ファイルを今すぐ開き
  ますか?」

そこで、拡張子を「*.xml」に変更し、Openxmlメソッドに変えてみましたが、
同様のエラーでした。
XPの場合は、警告メッセージが表示されることなく開くことができます。

投稿者:まなか

編集 履歴 (0)

office2003が今使えないので、検証できませんが

拡張子と中身が不一致の警告メッセージが出ます。

これは、サーバー側で拡張子xlsでOpenメソッドを使用した場合と解釈して話を続けます。

OpenXmlメソッドはXMLデータ形式を開くメソッドの様ですが、
拡張子xml+Openメソッドではエラーですか?

DisplayAlerts=falseにした場合は?

投稿者:デューン

編集 履歴 (0)

デューンさん、ありがとうございます。

拡張子xml+Openメソッドでも同じエラーでした。
DisplayAlerts=falseにしています。

コードは遅延バインディングですが、事前バインディングにしても同様です。



Try
    oExcel = CreateObject("Excel.Application")

    oExcel.DisplayAlerts = False
    Dim oBooks As Object = oExcel.Workbooks

    Try
        Dim oBook As Object = oBooks.Open(sXlsFile)

    … … … …

[ メッセージ編集済み 編集者: まなか 編集日時 2009-03-02 13:43 ]

投稿者:まなか

編集 履歴 (0)

出てくるエラーが少し変わりました。
やはりxlsファイル形式の場合はエラーになりません。
エラーを指している行の処理は
Dim oBook As Object = oBooks.Open(sXlsFile)
のところのままです。

--------------------------------------------------
System.Runtime.InteropServices.COMException (0x800A03EC): Workbooks クラスの Open プロパティを取得できません。
場所 Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack)
場所 Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
[ メッセージ編集済み 編集者: まなか 編集日時 2009-03-03 13:36 ]

投稿者:まなか

編集 履歴 (0)

スタック トレースを見る限り、遅延バインディングをやめれば一歩前進しそうなのですが。

まなかさんの書き込み (2009-03-02 15:28) より:

Workbooks クラスの Open プロパティを取得できません。

それにしてもプロパティ... って。(^-^;)

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさん

遅延バインディングでなく、事前バインディングでもエラーになります。

System.Runtime.InteropServices.COMException (0x800A03EC): HRESULT からの例外: 0x800A03EC
場所 Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)

エラーの場所は
  Dim oBook As Excel.Workbook = oBooks.Open(sXlsFile)
です。



Dim oExcel As Excel.Application = Nothing
Try
    oExcel = New Excel.Application

    oExcel.DisplayAlerts = False
    Dim oBooks As Excel.Workbooks = oExcel.Workbooks

    Try 
        Dim oBook As Excel.Workbook = oBooks.Open(sXlsFile)

[ メッセージ編集済み 編集者: まなか 編集日時 2009-03-03 13:36 ]

投稿者:まなか

編集 履歴 (0)

まなかさんの書き込み (2009-03-02 12:10) より:

そこで、拡張子を「*.xml」に変更し、Openxmlメソッドに変えてみましたが、同様のエラーでした。

まなかさんの書き込み (2009-03-03 09:13) より:

遅延バインディングでなく、事前バインディングでもエラーになります。

失礼しました。 事前バインディングで試しているのはわかっていたのですが、OpenXML メソッドと '併用' してダメだったのか確認したかったのでした。

事前バインディング + OpenXML メソッドでもダメだったのであれば、そもそも Excel 12.0 に対応している形式なのか疑いたくなりますね。 拡張子を .xml にしてエクスプローラから EXCEL.EXE の関連起動で正しく起動できるかを確認してみて頂けますか? これで開けなければそもそも無理だということになります。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさん、ありがとうごさいます。

拡張子と中身が不一致、というメッセージが出るだけで開くことができます…
ということで、今回はあきらめることにします…

皆様のシステムではxmlスプレッドシート形式のファイルを読み込むことが
ないんですね…ググってみても、同じエラーが出てこないんです。

ありがとうございました。

投稿者:まなか

編集 履歴 (0)

まなかさんの書き込み (2009-03-02 09:29) より:

ファイルの種類:XMLスプレッドシート2003(*.xml)で作成されたExcelファイルを指定すると以下のエラーが出ます。

サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT))

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Runtime.InteropServices.COMException: サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT))

ソース エラー:

xlBooks = xlApp.Workbooks

Try

xlBook = xlBooks.Open(importFile) ←ここが赤くなっています。

取り込むファイルの拡張子は「xls」なのですが、ファイルの種類が「xml」です。

一旦開いて「Microsoft Excel97-Excel 2003 および5.0/95ブック(*.xls)」で保存しなおしたファイルは正常に処理できます。

サーバーは2003Serverで、Excel2007です。

Excel2003の時はエラーになりませんでした。

ちなみに、Windows XPのクライアントマシンにIISを立てて同じようにExcel2007にした場合はエラーになりません。

Excel 2003 で作成したファイルを、Excel 2007 で読み込もうとしている、、、のでしょうか?
ファイルをテキスト エディタで開いて、1行目2行目あたりに、Excel のバージョンを特定するような要素が含まれていないか、確認してみてください。

あと、Open メソッドの引数に、なにか互換性に関するフラグがあったりしませんかね?

投稿者:Jitta

編集 履歴 (0)

Jittaさん、ありがとうございます。

Jittaさんの書き込み (2009-03-03 22:33) より:

Excel 2003 で作成したファイルを、Excel 2007 で読み込もうとしている、、、のでしょうか?

ファイルをテキスト エディタで開いて、1行目2行目あたりに、Excel のバージョンを特定するような要素が含まれていないか、確認してみてください。

あと、Open メソッドの引数に、なにか互換性に関するフラグがあったりしませんかね?

作成ファイルはExcel2003かどうかはわかりませんが、Excel2007で読み込もうとしています。

Openメソッドの引数、調べてみます。

テキストエディタで開いたところ、バージョンを示すようなものは見当たりませんでした。



<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">

[ メッセージ編集済み 編集者: まなか 編集日時 2009-03-04 09:49 ]

投稿者:まなか

編集 履歴 (0)

参考までに、いろいろ試してみました。

ファイルはOffice2007から2003スプレッド形式(xml)で出力しました。
C:\Book1.xml
(パターン毎に拡張子のみを変更しています)

<環境1.WinXP>
A.Excel2007 にドロップして直接開いた場合

Book1.xmlの場合→警告なく正常に開く
Book1.xlsに拡張子を変更した場合→拡張子が違う旨の警告がでる

B.Excel2007 のマクロエディタのイミディエイトウィンドウで以下を実行

Application.Workbooks.Open("C:\Book1.xml") →警告なく正常に開く
> 拡張子を変更
Application.Workbooks.Open("C:\Book1.xls") →警告なく正常に開く
Application.Workbooks.Open("C:\Book1.xl") →警告なく正常に開く

C.Windows アプリケーション(.NET 2.0)で事前バインディングで実行



    oXls = New Excel.Application()
    oBooks = oXls.Workbooks
    Try
        oBook = oBooks.Open(TextBox1.Text)

"C:\Book1.xml" →警告なく正常に開く
> 拡張子を変更
"C:\Book1.xls" →警告なく正常に開く
"C:\Book1.xl" →警告なく正常に開く

<環境2.Win2003 Enterprise R2 SP2>
XP環境と同様の結果

となりました。
なお、Excel.ApplicationオブジェクトのVisibleをOpen前でtrueにしても結果は同じでした。
また、windows2003とOffice2007の設定はインストール直後の状態から特に変更していません。

まなかさんとの違いと言えば、ASP.NETアプリケーションかどうかでしょうか。

投稿者:デューン

編集 履歴 (0)

デューンさん、検証までありがとうございます。
2003Serverのせいではないかと思うことにします…

投稿者:まなか

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。