2017-02-10 81 views
0

私の仕事は、C#Webアプリケーション内のいくつかのブックを見て、各ブックの特定の部分を1つの新しいブックに集約することです。これには、SpreadsheetGearを使用してセル範囲をコピーする必要があります。ほとんどの場合、これはうまくいきますが、範囲をコピーしても、その中の図形(画像または図表)はコピーされません。SpreadsheetGearでシェイプ(特にチャート)をコピーする

チャートをコピーするには、グラフが存在するセル範囲を特定し、そのセル範囲を他のワークシートの画像として追加できる画像に変えます。私はこれをテストして部分的な成功を収めました。最初にSpreadsheetGearでワークブックを開くと、いくつかのチャートの書式が失われているようです。ちなみに、このようなチャートを含むワークシートを保存すると、さらに多くの書式が消えてしまうようです。

チャートを含むワークシートはExcel 2013で作成され、SpreadsheetGearバージョン7.1.1.120を使用しています。

ここに私が始めているチャートの画像と、グラフを含むセル範囲からコピーされた画像があります(別の奇妙なことに、A2:A3の形状はその範囲のコピーを得ていません。 sheet.Shapesコレクションには表示されません)。

https://i.imgsafe.org/dc2b7118c4.png

https://i.imgsafe.org/dc2bec6e8f.png

ここで私は上記の例を生成するために使用されるいくつかの最小限のコードです。私は、シート内のすべての図形を通過し、画像などの形状を含む範囲をコピーします。

string exPath = System.Web.HttpContext.Current.Server.MapPath(@"~/App_Data"); 
string exFile = exPath + @"\examplechart.xlsx"; 
IWorkbook exBook = SpreadsheetGear.Factory.GetWorkbook(exFile, System.Globalization.CultureInfo.CurrentCulture); 
IWorksheet inSheet = exBook.Worksheets["Sheet1"]; 
IWorksheet outSheet = exBook.Worksheets["Sheet2"]; 
SpreadsheetGear.Shapes.IShapes shapes = inSheet.Shapes; 
foreach (SpreadsheetGear.Shapes.IShape shape in shapes) 
{ 
    IRange topLeft = shape.TopLeftCell; 
    IRange botRight = shape.BottomRightCell; 
    IRange imageRange = inSheet.Range[string.Format("{0}:{1}", topLeft.Address, botRight.Address)]; 

    // Where to place the shape in terms of columns and rows 
    int destinationColumn = shape.TopLeftCell.Column; 
    int destinationRow = shape.TopLeftCell.Row; 

    // Copy column widths 
    imageRange.Copy(outSheet.Range[destinationRow, destinationColumn], SpreadsheetGear.PasteType.ColumnWidths, PasteOperation.None, false, false); 

    // Add the cell range within which the shape is, as a picture, in the correct place 
    double left = outSheet.WindowInfo.ColumnToPoints(destinationColumn); 
    double right = outSheet.WindowInfo.ColumnToPoints(destinationColumn + imageRange.ColumnCount); 
    double top = outSheet.WindowInfo.RowToPoints(destinationRow); 
    double bottom = outSheet.WindowInfo.RowToPoints(destinationRow + imageRange.RowCount); 
    SpreadsheetGear.Drawing.Image image = new SpreadsheetGear.Drawing.Image(imageRange); 
    Bitmap bitmap = image.GetBitmap(); 
    ImageConverter converter = new ImageConverter(); 
    byte[] byteArray = (byte[])converter.ConvertTo(bitmap, typeof(byte[])); 

    outSheet.Shapes.AddPicture(byteArray, left, top, right - left, bottom - top); 
} 
exBook.SaveAs(exPath + @"\examplechart-output.xlsx", FileFormat.OpenXMLWorkbook); 
exBook.Close(); 

私は同じ結果で、むしろ彼らのセル範囲よりも画像に形状そのものをオンにしようとしました。シェイプやチャートをコピーするのはSpreadsheetGearと非常によく似ていないので、この種の問題について聞いたことがないかもしれません(あるいは、SpreadsheetGearのバージョンが古すぎるかもしれません)。 。

SpreadsheetGearで開いたときにグラフが奇妙に見える理由を知っている人は、私が見つけようとしている主なものです。しかし、あるシートから別のシートにシェイプ(図を含む)をコピーする方がより簡単な方法を知っていれば、それも私の問題を解決することができます。 (ボーナスの質問かもしれない:A2:A3の形状がSpreadsheetGearによってシートが開かれてもそこにないのはなぜですか?)

答えて

0

私はSpreadsheetGearのサポートに連絡しましたが、私の場合は不幸なSpreadsheetGearがサポートしていなかったワークシート内の問題が原因でした。つまり、グラフの系列値の静的データキャッシュ、シリーズデータラベルの 'show series name'オプション、行の "tailend"矢頭オプション、四重矢印オートシェイプです。これは、SpreadsheetGearでチャートや図形をコピーして問題を抱えている必要がある人にとっては、今後この問題が解決されたと考えています。

また、SpreadsheetGearに付属の 'SpreadsheetGear 2012 for Windows'アプリケーションを使用して、今後ワークシートを検査して、サポートされているものとサポートされていないものを簡単に確認することをお勧めしました。

関連する問題