使用SpreadsheetGear

时间:2017-02-10 13:53:03

标签: excel charts spreadsheetgear

我现在的任务是在C#Web应用程序中查看一些工作簿,并将每个工作簿的某些部分聚合到一个新的工作簿中。这要求我使用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打开时看起来很奇怪,那就是我想要找到的主要内容。但是,如果有人知道一种更直接的方式将形状(包括图表)从一张纸复制到另一张,这也可以解决我的问题。 (奖金问题可能是:当SpreadsheetGear打开工作表时,为什么A2:A3的形状甚至不存在?)

1 个答案:

答案 0 :(得分:0)

我联系了SpreadsheetGear支持,他们非常有帮助地澄清说,在我的情况下,SpreadsheetGear不支持的工作表中的一个不幸的混合,导致了问题。即(在我的情况下)图表中系列值的静态数据缓存,系列数据标签的“显示系列名称”选项,行上的“tailend”箭头选项和四箭头自动形状。对于那些需要使用SpreadsheetGear复制图表或形状并且遇到问题的人来说,这可能会有用,但我现在认为这个问题已经解决了。

此外,我被建议使用SpreadsheetGear附带的'SpreadsheetGear 2012 for Windows'应用程序来检查将来的工作表,以便轻松查看支持和不支持的内容。