Web を見回した後、私の問題に非常によく似た次の投稿 (以下) を見つけました。ただし、解決策を試した後も、私はまだ立ち往生しています。
基本的に、クライアントに送信する前に、Web サーバー上の Excel ファイルにデータを入力したいと考えています。
ワークブックのコードは次のとおりです。
namespace Inno.Data.Excel
{
public partial class ThisWorkbook
{
[Cached]
public DataSet Config = new DataSet();
private void ThisWorkbook_Startup(object sender, System.EventArgs e)
{
//InitializeCachedData();
var baseUrl = (string)Config.Tables["Config"].Rows[0].ItemArray[0];
var streamIds = (string)Config.Tables["Config"].Rows[0].ItemArray[1];
MessageBox.Show(baseUrl + " " + streamIds);
}
}
}
サーバー側には次のものがあります。
let rootUrl = Uri(x.Request.Url.GetLeftPart(UriPartial.Authority))
let setUpData (report : Report) (sd : ServerDocument) =
let url = rootUrl.AbsoluteUri
let streamIds = String.Join(",", report.series |> Seq.map(fun s -> s.id))
let dt = new System.Data.DataTable("Config")
dt.Columns.Add("BaseUrl", typeof<String>) |> ignore
dt.Columns.Add("StreamIds", typeof<String>) |> ignore
dt.Rows.Add([|box url; box streamIds|]) |> ignore
dt.AcceptChanges()
let cache = sd.CachedData.HostItems.["Inno.Data.Excel.ThisWorkbook"]
let urlItem = cache.CachedData.["Config"]
urlItem.SerializeDataInstance(dt)
sd.Save()
sd.Close()
let initialiseDocument (report : Report) (path : string) =
let fileName = report.name.Replace(" ", "_") + ".xlsx"
let sd = (new ServerDocument(path))
sd |> setUpData report
fileName
let docPath = x.Request.MapPath(Path.Combine(liveReportPath, "Inno.Data.Excel.xlsx"))
let fileName = initialiseDocument report docPath
x.File(File.OpenRead(docPath), "application/vnd.ms-excel", fileName) :> ActionResult
ただし、ダウンロード後にファイルを開こうとすると、次のエラーが発生します。
Microsoft.VisualStudio.Tools.Applications.Runtime.CannotFindObjectToFillException: Cannot find any public instance member with ID Config in object Inno.Data.Excel.ThisWorkbook.
私が試したこと: -
- DataSet ではなく単純な文字列を使用する
- 通話中
StartCaching("Config")
- ファイル オーバーロード
ServerDocument
を使用したメモリ内の操作byte[]
- 元の Excel ファイルをコピーしてコピーを操作する
しかし今、私はアイデアがありません。かなりの数の人がこのエラーを経験していることがわかります。この投稿で指摘されているように、VSTO 3.0 にはメモリ内のファイルを操作する既知のバグがありました。
前もって感謝します。