我使用以下代码将一个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”,图表就会自动修复,隐藏的系列会消失。
如何以编程方式实现此目的?
答案 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;