Как скопировать рабочий лист Excel в новую рабочую книгу и перенести все диаграммы, изображения и т. Д.? - PullRequest
4 голосов
/ 08 июня 2011

Наше приложение имеет функцию распространения.Требуется несколько электронных таблиц 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();
   }

Вам нужно сделать сохранение после каждой копии, чтобы получитьПаста для доработки.Спасибо за ваш вклад.

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Вам нужно будет проверить объект WORKSHEET рабочего листа, который вы хотите скопировать, затем запустить все свойства "* Objects" и, для каждой из этих коллекций, написать код, чтобы вручную скопировать все элементы в эта коллекция на новый лист.

Например, у вас есть:

ChartObjects ListObjects OleObjects Фигуры (которые могут быть скопированы вместе с листом, я не уверен).

1 голос
/ 09 июня 2011

Может быть, вы можете получить туда путем копирования / вставки? Вот пример, который копирует данные ячейки, диаграммы и изображения: MSDN

Удачи!

0 голосов
/ 18 февраля 2014

Вот как я это делаю - перемещает весь рабочий лист из исходной рабочей книги в совершенно новую рабочую книгу:

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 {}
}
}
0 голосов
/ 09 июня 2011

У меня нет ответа, но я могу дать вам несколько советов.Во-первых, это не вопрос openxml, это вопрос vsto.Во-вторых, изображения и диаграммы прикрепляются к электронной таблице, они не содержат в ней содержимого (тонкое различие).Вероятно, есть свойство всех диаграмм и одного из всех изображений, прикрепленных к листу.Скопируйте это через.

(я использую интерфейс IExtensibility вместо VSTO, поэтому я знаю, что находится в базовом API, но не имена свойств - извините.)

...