我们的应用程序具有分发功能。它需要几个Excel 2007电子表格,将它们复制到一个工作表中,然后通过电子邮件发送给用户。问题是图像和图表没有复制。我已经尝试了我能在这里找到的所有东西和其他各种来源,但遗憾的是似乎没有任何工作。我们的应用程序是使用VSTO编写的,我也尝试过OpenXML,但似乎没有任何工作。实际上,尝试在OpenXML中进行复制会严重损坏文件,导致Excel无法读取或恢复它们。这是我们使用的代码(注意:我们让ExcelWrapper在Excel App上调用相同的函数,但隐藏了所有可选项)。
private void CreateWorkbook(string filePath, string batchReportsPath)
{
//place the xlsx file into a workbook.
//call getfilesnames
Excel.Workbook bookToCopy;
Excel.Workbook newWorkbook;
Excel.Worksheet tempSheet = new Excel.Worksheet();
newWorkbook = ExcelWrapper.WorkbooksAdd(ExcelApp.Workbooks);
if (File.Exists(filePath))
File.Delete(filePath);
ExcelWrapper.WorkbookSaveAs(newWorkbook, filePath);
List<string> filePaths = new List<string>(Directory.GetFiles(batchReportsPath));
filePaths.ForEach(delegate(string reportPath)
{
string reportPathAndName = reportPath;
bookToCopy = ExcelWrapper.WorkbooksOpen(ExcelApp.Workbooks, reportPathAndName);
int nextSheetNumber = newWorkbook.Sheets.Count;
((Excel.Worksheet)sheetToSend.Sheets[1]).Copy(Type.Missing, newWorkbook.Sheets[nextSheetNumber]);
ExcelWrapper.WorkbookClose(bookToCopy);
});
newWorkbook.Save();
ExcelWrapper.WorkbookClose(newWorkbook);
bookToCopy= null;
tempSheet = null;
newWorkbook = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
我已经尝试了所有有前途的选项并搜索了VSTO和OpenXML对象模型,我很难过。请stackoverflow社区,你是我唯一的希望。
更新:以下是答案人:
//Copy all the images, Charts, shapes
foreach (Excel.Shape o in copySheet.Shapes)
{
if (o.Type == Microsoft.Office.Core.MsoShapeType.msoPicture)
o.CopyPicture();
else
o.Copy();
newWorkbook.Save();
}
您需要在每次复制后执行保存以获取最终确定的粘贴。感谢您的投入。
答案 0 :(得分:2)
您需要检查要复制的工作表的WORKSHEET对象,然后运行所有“* Objects”属性,并为每个集合编写代码以手动复制所有元素。该集合到新表。
例如,你有:
ChartObjects ListObjects OleObjects 形状(可能会与工作表一起复制,我不确定)。
答案 1 :(得分:1)
也许你可以通过复制/粘贴到达那里?以下是复制单元格数据,图表和图像的示例:MSDN
祝你好运!答案 2 :(得分:0)
我没有答案,但我可以给你一些指示。首先,这不是一个openxml问题,这是一个vsto问题。其次,图像和图表附在电子表格中,它们并不满足于它(一种微妙的区别)。可能存在所有图表的属性以及附在表格上的所有图像之一。复制它。
(我使用IExtensibility接口而不是VSTO,所以我知道底层API中有什么,但不知道属性名称 - 抱歉。)
答案 3 :(得分:0)
我是这样做的 - 将整个工作表从源工作簿移动到一个全新的工作簿:
public static void MoveWorksheet()
{
public static Excel.Application oXL;
public static Excel._Worksheet ws;
if (File.Exists(Global.Variables.GlobalVariables.recap))
{
//workbookToOpen is location and name
oXL.Workbooks.Open(workbookToOpen, Missing.Value, true);
object ws = null;
try
{
ws = wb.Sheets["Sheet 1"];
if (ws != null)
{
((Worksheet)ws).UsedRange.Interior.ColorIndex = Constants.xlNone;
((Worksheet)ws).Copy();
oXL.ActiveWorkbook.SaveAs("SaveAsFileName" + ".xlsx");
oXL.ActiveWorkbook.Close(true);
}
}
catch {}
}
}