【问题标题】:Excel Worksheet.Copy method copies some links in chart as externalExcel Worksheet.Copy 方法将图表中的一些链接复制为外部链接
【发布时间】:2014-02-18 18:54:52
【问题描述】:

我使用以下代码将一个 Excel 工作表复制到另一个工作簿。源 Excel 工作表包含隐藏行中的系列图表。 (这些系列在后面的代码之前被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”,图表就会自动修复,隐藏的系列就会消失。

如何以编程方式实现这一目标?

【问题讨论】:

    标签: c# excel charts excel-interop


    【解决方案1】:

    我现在已经浪费了几个小时来解决 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      相关资源
      最近更新 更多