Windows XP と C#.Net を使用した XML から Excel (2007) のアイデア
質問
データセットを xml ドキュメントに変更し、アプリケーションからデータをプログラムで開けるようにするために、xsl シートを使用して Excel xml 形式に変換しました。これに関して 2 つの問題に遭遇しました。
Excel は Excel ファイルを開くためのデフォルトの Windows アプリケーションではないため、Program.Start("xmlfilename.xml") を実行すると IE が開かれ、XML ファイルはあまり読みにくくなります。
ファイルの名前を .xlsx に変更すると、「これは Excel ファイルではありません。続行しますか?」という警告が表示されます。これは顧客にとって理想的なことではありません。
理想的には、Excel ファイルを開くためのデフォルトの OS 設定を変更せずに、Windows でファイルを Excel で開くことができるようにしたいと考えています。Office の相互運用性は可能ですが、このアプリケーションには少しやりすぎのように思えます。これを機能させるためのアイデアを持っている人はいますか?
ソリューションは .Net/C# ですが、クリーンなソリューションを作成するための他の可能性にもオープンです。
解決
Process.Start(@"C:\Program Files\Microsoft Office\Officexx\excel.exe", "yourfile.xml");
そうは言っても、メッセージボックスは引き続き表示されます。Interop を使用できると思いますが、それがどの程度うまく機能するかはわかりません。
他のヒント
XML の 2 行目に次のコードを挿入すると、Windows が Excel で開くように指示されます。
<?mso-application progid="Excel.Sheet"?>
ファイルを XML-Excel の拡張子である xlsx として保存するとどうなるでしょうか?
Sam が述べたように、ファイル拡張子は xlsx にするのがおそらく良い方法です。ただし、xml ファイルを xlsx として保存するだけではなく、さらに多くの作業が必要になります。xlsx は実際には、フォルダー内に多数の XML ファイルを含む zip ファイルです。良いサンプルコードを見つけました ここ 私は個人的に試したことはありませんが、これでいくつかの良い説明が得られるようです。
サードパーティのライブラリを接続することについて事前にお詫びします。無料ではないことは承知していますが、私は次のライブラリを使用しています。 フレックスセルスタジオ TMSソフトウェアから。データをダンプするだけではないこと (書式設定、動的クロス集計など) を実行したい場合は、非常にうまく機能します。私たちはそれを使用して週に何百ものレポートを作成しています。
FlexCel は、厳密に型指定されたデータセットを受け入れ、関係に従ってデータをグループ化でき、生成された Excel ファイルは、Crystal Reports Excel エクスポートから取得できるものよりもはるかにきれいに見えます。私は Crystal Reports と OLE オートメーションを実行しました。FlexCel は 125 EU ドルでお買い得です。
お役に立てれば。
MSDN の OpenXML - http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.openxml(v=office.11).aspx
using Excel = Microsoft.Office.Interop.Excel;
string workbookPath= @"C:\temp\Results_2013Apr02_110133_6692.xml";
this.lblResultFile.Text = string.Format(@" File:{0}",workbookPath);
if (File.Exists(workbookPath))
{
Excel.Application excelApp = new Excel.Application();
excelApp.Visible = true;
Excel.Workbook excelWorkbook = excelApp.Workbooks.OpenXML(workbookPath, Type.Missing, Excel.XlXmlLoadOption.xlXmlLoadPromptUser);
}
else
{
MessageBox.Show(String.Format("File:{0} does not exists", workbookPath));
}