1

私はスプレッドシートギアを使用して「大量」(100K+) の Excel ファイルをクロールしていますが、スプレッドシートギアが多くのポイントを持つチャートにヒットすると、すべてが壊れてしまうことがわかりました: メモリが解放されず、多くのメモリも消費します。非常に遅いので。

たとえば、それぞれ 96K ポイントの 35 のチャートを含む 63MB の Excel ファイルがあり、それぞれのビットマップを取得すると、1 つあたり 100MB+ を占め、リリースされません (少なくともワークシートを閉じるまで)。プログラムをすべてのチャートで実行すると、9 GB を超えるコミットが発生します。そして、すべてのファイルをサポートするために必要な 32 GB 以上にアップグレードするよう顧客に依頼することは絶対にできません。

これを行う代替手段はありますか?遅くなるファイルをスキップしてこれを実行しようとしても問題ありませんが (seriescollection のポイントのカウントを確認します)、ポイントへのアクセスが問題であるように思われるため、これは役に立ちませんでした (points.count をチェックするだけでロードされるようです)すべてのポイントとそれに関連するデータ!)。

別の方法 (スプレッドシートギアを使用するか、何もインストールする必要がなく、すべての Excel ファイル形式をサポートするライブラリを使用する) でグラフを取得できるようにするか、グラフが多すぎるかどうかを確認する方法を教えてください。 points.count を使用しないポイント。

とても具体的なことを尋ねるのはちょっとワイルドショットですが、私はそこで本当に迷っています。

4

1 に答える 1

0

まったく同じ問題ではありませんが、スプレッドシートのギア チャート イメージを MVC アプリケーションのコンテキストに保持しようとしてさまざまな問題が発生したため、チャートを png 画像としてサーバーに保存し、サーバーから呼び出す方法を採用することにしました。ビューに。

これは、Excel グラフをサーバーに保存し、剃刀ビューで取得するコードです。

<!-- language: lang-cs -->
// Get the image from the spreadsheet
SpreadsheetGear.Shapes.IShape chart7 = worksheet.Shapes["Chart 7"];
SpreadsheetGear.Drawing.Image image7 = new SpreadsheetGear.Drawing.Image(chart7);
saveChartImage(image7, "Chart7.png");

//Save chart images to the server
private void saveChartImage(SpreadsheetGear.Drawing.Image image, string chartName)
{
    var imageFile = System.IO.Path.Combine(imagePath, chartName);
    System.Drawing.Image bitmap = image.GetBitmap();
    bitmap.Save(imageFile, System.Drawing.Imaging.ImageFormat.Png);
}

// Action result to get image    
public ActionResult getImage(string imageDir, string filename)
{
    var file = filename;
    var fullPath = Path.Combine(imageDir, file);
    return File(fullPath, "image/png", file);
}

ビューで画像を取得します。

<img src="@Url.Action("getImage", new { imageDir = "~/images/" "filename = "Chart7.png" })" />

非常に大規模で複雑なスプレッドシート (6 ~ 8MB) でこの方法を使用しました。このコードは、400 以上のデータ ポイントを含む 16 の散布図から画像を呼び出します。これらのグラフはサーバー上で約 16KB であり、私が知る限り、保存/取得時間はサーバーではなくインターネット接続によって制限されます。

この方法の欠点は、マルチユーザー環境に対応できないことです。そのためには、ユーザー セッションを作成し、ユーザーに固有のチャート名を付ける必要があります。

于 2013-07-23T00:45:24.673 に答える