VSTO を使用してドキュメントをダウングレードしようとしています。
バイト配列を受け取る Web サービスがあります。このバイトは、現在アクティブなドキュメントからのものです。
Web サービスは、2007/2003 ワードの doc ファイルのみを処理できます。
だから私は使いたい
document.DowngradeDocument();
しかし、バイト配列を送信すると、Web サービスはエラーを報告します。名前を付けて保存し、単語を強制的に 2007/2003 doc 形式で保存する場合、問題はありません。
だから私の質問は:
1) DowngradeDocument() 関数が機能しないのはなぜですか。適切なダウングレードを行っていないのはなぜですか。2) DowngradeDocument() を呼び出したときに何か他のことをする必要がありますか?
たまたま作業中のファイルがディスクに保存されていないため、これはメモリ内にある必要があります。
// デニス
これを読んでくれてありがとう
--- d を編集します。20120904 ---
エラーの意味がわからないため、Webサービスエラーを使用できません。ファイルを見つけることができると表示されていますが、これは相手側のアプリケーション内のエラーです。
そのため、ドキュメントを正しい形式で保存し、ダウングレードしたものを保存しようとしました。同じコードを使用しました。1つは機能し、もう1つは機能しませんでした。
ただし、ファイルを一時的に保存する方法は次のとおりです。この関数を呼び出す前に、document.DowngradeDocument(); を実行しました。
そのため、ダウングレード機能を呼び出しながら、保存するときにフォーマットも変更する必要があります。この関数のドキュメントでは、関数が呼び出された場合、Office の以前のバージョンはすべてそれを読み取ることができることが明らかです。
/// <summary>
/// Make a copy of ActiveDocument in current user temp folder, and get a byte[].
/// </summary>
/// <param name="filename"></param>
/// <param name="document"></param>
/// <param name="file"></param>
/// <returns></returns>
private byte[] MakeCopy(string filename, Document document, out FileInfo file)
{
// http://blogs.msdn.com/b/pranavwagh/archive/2008/04/03/how-to-do-a-save-copy-as-in-word.aspx
// http://stackoverflow.com/questions/12175273/serialize-current-activedocument-from-office-2007-add-in
Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
wdApp.Visible = false;
{
// make a fil i Current user temp folder
// http://stackoverflow.com/questions/944483/how-to-get-temporary-folder-for-current-user
string tempPath = System.IO.Path.GetTempPath();
string fileName = Path.Combine(tempPath, GenerateValidFileName(filename)) + ".doc";
IPersistFile compoundDocument = document as IPersistFile;
compoundDocument.Save(fileName, false);
byte[] content = File.ReadAllBytes(fileName);
file = new FileInfo(fileName);
wdApp.Quit();
return content;
}
}