Наше приложение имеет функцию распространения.Требуется несколько электронных таблиц Excel 2007, они копируются в один лист и отправляются пользователям по электронной почте.Проблема в том, что изображения и диаграммы не копируются.Я перепробовал все, что могу найти здесь и в других источниках, но, к сожалению, ничего не получается.Наше приложение написано с использованием VSTO, и я также пробовал OpenXML, но, похоже, ничего не работает.Фактически, попытка скопировать в OpenXML повредила файлы настолько сильно, что Excel не смог прочитать или восстановить их.Вот код, который мы используем (примечание: у нас ExcelWrapper просто вызывает те же функции в приложении Excel, но скрывает все необязательные элементы).
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();
}
Вам нужно сделать сохранение после каждой копии, чтобы получитьПаста для доработки.Спасибо за ваш вклад.