Excel Worksheet.Copy方法将图表中的某些链接复制为外部链接

时间:2014-02-17 14:57:53

标签: c# excel charts excel-interop

我使用以下代码将一个Excel工作表复制到另一个工作簿。源Excel工作表包含隐藏行中具有系列的图表。 (theese系列在下面的代码之前被c#中的代码隐藏)

Worksheet w; //My source worksheet with chart
w.Activate();
w.Name = CreateValidWorksheetName(targetSheetName);
w.get_Range("a1").EntireRow.EntireColumn.Copy();
w.get_Range("a1").EntireRow.EntireColumn.PasteSpecial(XlPasteType.xlPasteValues);
w.Range["A1:A1"].Select();

if (targetWorkbook != null)
{                                        
    w.Copy(targetWorkbook.Sheets[1], Type.Missing);
    targetWorkbook.RefreshAll();
}

....
targetWorkbook.SaveAs(...

现在正确复制了可见系列,但隐藏的系列被复制为外部链接,例如: ='C:\ X [sourceWorkbook.xlsx] PDK 0-32 kv'!$ D $ 23:$ D $ 100

现在出现问题部分。当我打开“targetWorkbook”时,我看到了丑陋的图表,包括隐藏的系列。但是,只要我在Excel中手动打开“sourceWorkbook”,图表就会自动修复,隐藏的系列会消失。

如何以编程方式实现此目的?

1 个答案:

答案 0 :(得分:0)

我现在已经失去了几个小时的工作来解决Worksheet.Copy方法中的这个错误。有时我想知道为什么我不是更差的学生,我现在可以做更有用的事情......

首先我尝试了:

//Break links
System.Array links = (System.Array) ((object)targetWorkbook.LinkSources(XlLink.xlExcelLinks));
if (links != null)
{
    for (int i = 1; i <= links.Length; i++)
    {
        try
        {
            targetWorkbook.UpdateLink((string)links.GetValue(i),
                        XlLinkType.xlLinkTypeExcelLinks);
            targetWorkbook.BreakLink((string)links.GetValue(i),
                        XlLinkType.xlLinkTypeExcelLinks);
        }
        catch (Exception ex)
        {
            Tools.LogException(ex, "targetWorkbook.BreakLink");
        }
    }
}

没有成功,我甚至得到了HRESULT错误。即使使用Excel的可视界面也无法删除外部链接,这可能只会吞下此异常。

最后这就是诀窍:

w.Activate();
w.Name = CreateValidWorksheetName(targetSheetName);
w.get_Range("a1").EntireRow.EntireColumn.Copy();
w.get_Range("a1").EntireRow.EntireColumn.PasteSpecial(XlPasteType.xlPasteValues);
w.Range["A1:A1"].Select();

if (targetWorkbook != null)
{
    //Unhide all rows and then copy!!!
    w.get_Range("a1").EntireRow.EntireColumn.Hidden = false;
    w.get_Range("a1").EntireColumn.EntireRow.Hidden = false;
    w.Copy(targetWorkbook.Sheets[1], Type.Missing);
    //Then hide all rows again
    HideRows(true, targetWorkbook.Sheets[1].UsedRange, "***HIDETHISROW***");
    HideRows(false, targetWorkbook.Sheets[1].UsedRange, "***HIDETHISCOL***");

检查源工作簿的文件类型与目标工作簿是否匹配(两者都是xlsx)也很重要,否则你可能会得到:

“Excel无法将工作表插入目标工作簿,因为它包含的行和列比源工作簿少。要将数据移动或复制到目标工作簿,可以选择数据,然后使用复制和粘贴命令将其插入另一个工作簿的工作表中。“

 _ExcelApp.DefaultSaveFormat = Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook;