2014-11-20 3 views
4

ExcelWorkSheet 및 복사 한 시트 CodeModule을 복사하는 데 문제가 있습니다. 설명해 드리죠 :새 CodeModule을 사용하여 템플릿에서 ExcelWorkSheet를 복사하는 방법

시나리오 : 내가 엑셀 ​​매크로의 (.xlsm)로 파일을 가지고 파일을 엑셀 나는 이것이 다른 만들 수있는 템플릿으로 파일을 엑셀 사용 (데이터는 새 파일에 복사됩니다).

그래서 먼저 데이터베이스에서 일부 데이터를 가져 와서 Excel 템플릿 (.xlsm) 파일을 엽니 다. 특정 시점에서

, 일부 항목은 'WorkSheets.Add가()'에 오는 곳이며, 다른 워크 시트에 있어야합니다.

var newSheet = workbook.Worksheets.Add("someName", templateSheet); 

을 템플릿 시트 ('VBA'을 포함 복사 한 후 코드뿐만 아니라 복제하고 싶습니다), 나는 문제가 발생했습니다.

새로 만든 시트의 'CodeModule'은 이름과 참조로 템플릿의 것과 동일합니다.

즉, 모든 속성 값은 동일하고 workbook.VbaProject.Modules에는 템플릿 파일의 초기 코드 모듈 만 포함되고 새 파일에는 newSheet의 새 코드 모듈이 포함되지 않습니다.

더 나쁜,이 같은 새로운 CodeModule을 결합하려는 경우 :

workbook.VbaProject.Modules.AddModule("test"); 
newSheet.CodeModule.Name = "test"; 

모두 newSheet.CodeModuletemplateSheet.CodeModulenull으로 설정됩니다 (물론 Nothing 실제로, 나는 VB.Net을 사용하고 있기 때문에).

그래서 질문 :이 버그입니까? 아니면 여기서 뭔가 잘못하고 있습니까? 더 나은 점은이 시나리오를 수행하는 방법을 안내 할 수 있습니까?

답변

4

버그 것 같다. epplus 프로젝트의 문제 센터에서 문제를 만들었습니다. 나는 아직 새 버전을 테스트하지 않았습니다

https://epplus.codeplex.com/workitem/15095

resolved로는 표시되었습니다. 완료되면 업데이트 해 드리겠습니다.

업데이트 최신 소스에서이 문제가 해결되었습니다.

+0

당신이 최신이라고 말할 때 나는 그것을 4라고 가정한다.0 (베타)? 따라와 주셔서 감사합니다. – Ernie

+0

@Ernie : 사용 가능한 최신 바이너리인지 확실하지 않습니다. 나는 소스를 쥐고 그것을 컴파일했다. (베타 버전에 아직 포함되지 않았다는 인상을 받았기 때문에) ... 그리고 아무런 문제없이 컴파일되었다. 프로젝트를 열고 빌드하십시오. – Stefan

3

나는 당신이 뭔가에 있다고 생각합니다. 나는 같은 것을 보았다 - EPP 3.1을 사용한다. xlsm 파일 형식의 전체 vba 항목은 XML 기반이 아니기 때문에 다릅니다.이 파일들은 호환 파일이 들어있는 bin 파일입니다. 그래서, 내가 본 것을 기반으로, EPPlus의 결함이며 제출할 가치가 있습니다. 여기가 바로 그 솔루션에 드롭 할 수있는 단위 테스트 (즉 내가 EPP와 장난하고 때 내가 할 것입니다) :

[TestMethod] 
public void VBAWorksheetCopyTest() 
{ 
    var sb = new StringBuilder(); 
    sb.AppendLine("Private Sub Test()"); 
    sb.AppendLine(" Range(\"G10\").Value = \"TEST\""); 
    sb.AppendLine("End Sub"); 

    var existingFile = new FileInfo(@"c:\temp\temp1.xlsm"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    using (var package = new ExcelPackage(existingFile)) 
    { 
     var workbook = package.Workbook; 
     workbook.CreateVBAProject(); 

     var worksheet = workbook.Worksheets.Add("templateSheet"); 

     //Module saved in the workSHEET 
     worksheet.CodeModule.Code = sb.ToString(); 
     worksheet.CodeModule.Name = "templateSheet"; 

     worksheet.Cells["A1"].Value = "Col1"; 
     worksheet.Cells["A2"].Value = "sdf"; 
     worksheet.Cells["A3"].Value = "wer"; 

     package.Save(); 
    } 

    //Open temp1.xlsm and copy the sheet 
    using (var package = new ExcelPackage(existingFile)) 
    { 
     var workbook = package.Workbook; 
     var templateSheet = workbook.Worksheets["templateSheet"]; 
     var someName = workbook.Worksheets.Add("someName", templateSheet); 

     //VBA code does seem to copy but dose NOT match what is seen in excel 
     Assert.IsTrue(templateSheet.CodeModule.Code.Length > 0); 
     Assert.IsTrue(someName.CodeModule.Code.Length > 0); 

     package.Save(); 
    } 

    //Open temp1 and try to name the modules 
    using (var package = new ExcelPackage(existingFile)) 
    { 
     var workbook = package.Workbook; 
     var templateSheet = workbook.Worksheets["templateSheet"]; 
     var someName = workbook.Worksheets["someName"]; 

     //Give it a name otherwise Excel autonames it 'newsheet1' 
     someName.CodeModule.Name = "someName"; //BUT will cause both CodeModule objects to go null 

     //These will now fail becuase codemodule is now null for both 
     Assert.IsTrue(templateSheet.CodeModule.Code.Length > 0); 
     Assert.IsTrue(someName.CodeModule.Code.Length > 0); 
    } 
} 

enter image description here

+1

테스트 주셔서 감사합니다. 문제 센터에서 문제를 만들었습니다. 이미 (이미) 해결 된 것으로 표시되었습니다. 테스트를 해본 결과 결과를 알려 드리겠습니다. – Stefan

+0

FYI : 최신 소스를 다운로드했으며 버그가 해결 된 것으로 보입니다. :) – Stefan

관련 문제