2017-02-10 63 views
0

我現在的任務是瀏覽我的C#Web應用程序中的一些工作簿,並將每個工作簿的某些部分合併到一個新的工作簿中。這需要我使用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不支持的工作表中的東西,這是導致問題的原因。即(在我的情況下)圖表中的系列值的靜態數據緩存,系列數據標籤的'顯示系列名稱'選項,行上的「tailend」箭頭選項以及四向箭頭自選圖形。對於那些需要使用SpreadsheetGear複製圖表或形狀並遇到問題的人來說,這可能會很有用,但我現在認爲這個問題已經解決。

此外,我被建議使用SpreadsheetGear附帶的'SpreadsheetGear 2012 for Windows'應用程序來檢查將來的工作表,以便輕鬆查看什麼和不支持。