Копирование рабочих листов между различными экземплярами Excel. Приложение - PullRequest
1 голос
/ 01 апреля 2020

Я работаю над надстройкой VSTO Excel, где в какой-то момент она откроет рабочую книгу шаблона из ресурсов и скопирует лист из нее в работающий экземпляр Excel. Я хочу избежать короткого белого окна fla sh при копировании из шаблона, поэтому я создал скрытый экземпляр Excel.Application и вызвал его оттуда. Эта часть работает, но при копировании я получаю «System.Runtime.InteropServices.COMException:« Метод копирования класса Worksheet не выполнен »

Dim tempFileName As String = "DesignWorks1_Template"
Dim tempName As String = Path.GetTempPath() & "\" & tempFileName & ".xlsx"
Dim ResMgr = New Resources.ResourceManager("MyUtilities.Resources", System.Reflection.Assembly.GetExecutingAssembly)
Dim fstream As New FileStream(tempName, FileMode.Create, FileAccess.Write)
Dim filestreamWrite As New BinaryWriter(fstream)
filestreamWrite.Write(My.Resources.DesignWorks1, 0, My.Resources.DesignWorks1.Length)
fstream.Close()
filestreamWrite.Close()

Dim currentWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
Dim newHiddenApp As New Excel.Application
newHiddenApp.Visible = False
Dim oTemplate As Excel.Workbook = newHiddenApp.Workbooks.Add(tempName)
oTemplate.Worksheets(compareName).Copy(currentWorkbook.Worksheets(1)) 'error here
oTemplate.Close()
My.Computer.FileSystem.DeleteFile(tempName)
ResMgr.ReleaseAllResources()

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Можно ли указать конкретный лист из шаблона? Я пробовал Sheets.Add, но, кажется, импортирует все листы по указанному пути. - Virtual Underscore

Это основная проблема при экспорте каждого листа в рабочей книге в файл шаблона WorkSheet. При выполнении шаблона «Сохранить как» рабочий лист должен быть единственным рабочим листом в рабочей книге. Если в Рабочей книге существует более одного Рабочего листа, вы будете экспортировать шаблон Рабочей книги.

Вы можете скопировать следующий код VBA в файл кода ThisWorkbook Рабочей книги, из которой вы хотите экспортировать шаблоны. Убедитесь, что вы изменили строку templateFolder = "F:\Temp\Templates" в коде. Запустите его, и он будет экспортировать каждый рабочий лист в рабочую книгу.

Sub ExportWorksheetTemplates()
   Excel.Application.DisplayAlerts = False
   Excel.Application.ScreenUpdating = False

   Dim templateFolder As String
   templateFolder = "F:\Temp\Templates"   ' set this to an existing folder on you system

   Dim tmpWb As Excel.Workbook
   Dim old_numsheets As Integer

   old_numsheets = Excel.Application.SheetsInNewWorkbook
   Excel.Application.SheetsInNewWorkbook = 1

   Dim ws As Excel.Worksheet
   Dim newWBFirstSheet As Excel.Worksheet

   Dim templatePath As String

   On Error GoTo Finalize

   For Each ws In ThisWorkbook.Worksheets
      Set tmpWb = Excel.Application.Workbooks.Add()
      Set newWBFirstSheet = tmpWb.Worksheets(1)
      newWBFirstSheet.Name = "."
      ws.Copy after:=newWBFirstSheet
      newWBFirstSheet.Delete


      templatePath = templateFolder & "\" & tmpWb.Worksheets(1).Name & ".xltx"
      tmpWb.Worksheets(1).SaveAs templatePath, Excel.XlFileFormat.xlOpenXMLTemplate

      tmpWb.Close
   Next

Finalize:
   Excel.Application.DisplayAlerts = True
   Excel.Application.ScreenUpdating = True
   Excel.Application.SheetsInNewWorkbook = old_numsheets
End Sub

Теперь вы можете добавить каждый из этих файлов в ресурсы проекта VSTO.

Затем вы экспортируете шаблоны ресурсов во временный файл, как вы это делаете в настоящее время.

Когда вы используете метод Sheets.Add и задаете Type:="path to template", вы теперь будет добавлен только один рабочий лист, добавленный в рабочую книгу.

0 голосов
/ 01 апреля 2020

При запуске Excel на рабочем столе нельзя копировать листы между экземплярами. Поэтому я сомневаюсь, что это можно сделать, когда экземпляры Excel инициируются с помощью VB.

Для того чтобы копировать листы между рабочими книгами, они должны выполняться в одном экземпляре.

...