私の仕事は、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によってシートが開かれてもそこにないのはなぜですか?)