| using System; | |
| using System.Text; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| using Microsoft.VisualStudio.TestTools.UnitTesting; | |
| using OfficeOpenXml.Utils; | |
| using OfficeOpenXml; | |
| using System.Security.Cryptography.X509Certificates; | |
| using System.IO; | |
| using System.Security.Cryptography; | |
| using OfficeOpenXml.VBA; | |
| namespace EPPlusTest | |
| { | |
| [TestClass] | |
| public class VBA | |
| { | |
| #if !MONO | |
| [TestMethod] | |
| public void Compression() | |
| { | |
| //Compression/Decompression | |
| string value = "#aaabcdefaaaaghijaaaaaklaaamnopqaaaaaaaaaaaarstuvwxyzaaa"; | |
| byte[] compValue = CompoundDocument.CompressPart(Encoding.GetEncoding(1252).GetBytes(value)); | |
| string decompValue = Encoding.GetEncoding(1252).GetString(CompoundDocument.DecompressPart(compValue)); | |
| Assert.AreEqual(value, decompValue); | |
| value = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | |
| compValue = CompoundDocument.CompressPart(Encoding.GetEncoding(1252).GetBytes(value)); | |
| decompValue = Encoding.GetEncoding(1252).GetString(CompoundDocument.DecompressPart(compValue)); | |
| Assert.AreEqual(value, decompValue); | |
| } | |
| #endif | |
| [Ignore] | |
| [TestMethod] | |
| public void ReadVBA() | |
| { | |
| var package = new ExcelPackage(new FileInfo(@"c:\temp\report.xlsm")); | |
| File.WriteAllText(@"c:\temp\vba\modules\dir.txt", package.Workbook.VbaProject.CodePage + "," + package.Workbook.VbaProject.Constants + "," + package.Workbook.VbaProject.Description + "," + package.Workbook.VbaProject.HelpContextID.ToString() + "," + package.Workbook.VbaProject.HelpFile1 + "," + package.Workbook.VbaProject.HelpFile2 + "," + package.Workbook.VbaProject.Lcid.ToString() + "," + package.Workbook.VbaProject.LcidInvoke.ToString() + "," + package.Workbook.VbaProject.LibFlags.ToString() + "," + package.Workbook.VbaProject.MajorVersion.ToString() + "," + package.Workbook.VbaProject.MinorVersion.ToString() + "," + package.Workbook.VbaProject.Name + "," + package.Workbook.VbaProject.ProjectID + "," + package.Workbook.VbaProject.SystemKind.ToString() + "," + package.Workbook.VbaProject.Protection.HostProtected.ToString() + "," + package.Workbook.VbaProject.Protection.UserProtected.ToString() + "," + package.Workbook.VbaProject.Protection.VbeProtected.ToString() + "," + package.Workbook.VbaProject.Protection.VisibilityState.ToString()); | |
| foreach (var module in package.Workbook.VbaProject.Modules) | |
| { | |
| File.WriteAllText(string.Format(@"c:\temp\vba\modules\{0}.txt", module.Name), module.Code); | |
| } | |
| foreach (var r in package.Workbook.VbaProject.References) | |
| { | |
| File.WriteAllText(string.Format(@"c:\temp\vba\modules\{0}.txt", r.Name), r.Libid + " " + r.ReferenceRecordID.ToString()); | |
| } | |
| List<X509Certificate2> ret = new List<X509Certificate2>(); | |
| X509Store store = new X509Store(StoreLocation.CurrentUser); | |
| store.Open(OpenFlags.ReadOnly); | |
| package.Workbook.VbaProject.Signature.Certificate = store.Certificates[19]; | |
| //package.Workbook.VbaProject.Protection.SetPassword(""); | |
| package.SaveAs(new FileInfo(@"c:\temp\vbaSaved.xlsm")); | |
| } | |
| [Ignore] | |
| [TestMethod] | |
| public void WriteVBA() | |
| { | |
| var package = new ExcelPackage(); | |
| package.Workbook.Worksheets.Add("Sheet1"); | |
| package.Workbook.CreateVBAProject(); | |
| package.Workbook.VbaProject.Modules["Sheet1"].Code += "\r\nPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)\r\nMsgBox(\"Test of the VBA Feature!\")\r\nEnd Sub\r\n"; | |
| package.Workbook.VbaProject.Modules["Sheet1"].Name = "Blad1"; | |
| package.Workbook.CodeModule.Name = "DenHärArbetsboken"; | |
| package.Workbook.Worksheets[1].Name = "FirstSheet"; | |
| package.Workbook.CodeModule.Code += "\r\nPrivate Sub Workbook_Open()\r\nBlad1.Cells(1,1).Value = \"VBA test\"\r\nMsgBox \"VBA is running!\"\r\nEnd Sub"; | |
| //X509Store store = new X509Store(StoreLocation.CurrentUser); | |
| //store.Open(OpenFlags.ReadOnly); | |
| //package.Workbook.VbaProject.Signature.Certificate = store.Certificates[11]; | |
| var m = package.Workbook.VbaProject.Modules.AddModule("Module1"); | |
| m.Code += "Public Sub Test(param1 as string)\r\n\r\nEnd sub\r\nPublic Function functest() As String\r\n\r\nEnd Function\r\n"; | |
| var c = package.Workbook.VbaProject.Modules.AddClass("Class1", false); | |
| c.Code += "Private Sub Class_Initialize()\r\n\r\nEnd Sub\r\nPrivate Sub Class_Terminate()\r\n\r\nEnd Sub"; | |
| var c2 = package.Workbook.VbaProject.Modules.AddClass("Class2", true); | |
| c2.Code += "Private Sub Class_Initialize()\r\n\r\nEnd Sub\r\nPrivate Sub Class_Terminate()\r\n\r\nEnd Sub"; | |
| package.Workbook.VbaProject.Protection.SetPassword("EPPlus"); | |
| package.SaveAs(new FileInfo(@"c:\temp\vbaWrite.xlsm")); | |
| } | |
| [Ignore] | |
| [TestMethod] | |
| public void Resign() | |
| { | |
| var package = new ExcelPackage(new FileInfo(@"c:\temp\vbaWrite.xlsm")); | |
| //package.Workbook.VbaProject.Signature.Certificate = store.Certificates[11]; | |
| package.SaveAs(new FileInfo(@"c:\temp\vbaWrite2.xlsm")); | |
| } | |
| [Ignore] | |
| [TestMethod] | |
| public void WriteLongVBAModule() | |
| { | |
| var package = new ExcelPackage(); | |
| package.Workbook.Worksheets.Add("VBASetData"); | |
| package.Workbook.CreateVBAProject(); | |
| package.Workbook.CodeModule.Code = "Private Sub Workbook_Open()\r\nCreateData\r\nEnd Sub"; | |
| var module = package.Workbook.VbaProject.Modules.AddModule("Code"); | |
| StringBuilder code = new StringBuilder("Public Sub CreateData()\r\n"); | |
| for (int row = 1; row < 30; row++) | |
| { | |
| for (int col = 1; col < 30; col++) | |
| { | |
| code.AppendLine(string.Format("VBASetData.Cells({0},{1}).Value=\"Cell {2}\"", row, col, new ExcelAddressBase(row, col, row, col).Address)); | |
| } | |
| } | |
| code.AppendLine("End Sub"); | |
| module.Code = code.ToString(); | |
| //X509Store store = new X509Store(StoreLocation.CurrentUser); | |
| //store.Open(OpenFlags.ReadOnly); | |
| //package.Workbook.VbaProject.Signature.Certificate = store.Certificates[19]; | |
| package.SaveAs(new FileInfo(@"c:\temp\vbaLong.xlsm")); | |
| } | |
| [Ignore] | |
| [TestMethod] | |
| public void VbaError() | |
| { | |
| DirectoryInfo workingDir = new DirectoryInfo(@"C:\epplusExample\folder"); | |
| if (!workingDir.Exists) workingDir.Create(); | |
| FileInfo f = new FileInfo(workingDir.FullName + "//" + "temp.xlsx"); | |
| if (f.Exists) f.Delete(); | |
| ExcelPackage myPackage = new ExcelPackage(f); | |
| myPackage.Workbook.CreateVBAProject(); | |
| ExcelWorksheet excelWorksheet = myPackage.Workbook.Worksheets.Add("Sheet1"); | |
| ExcelWorksheet excelWorksheet2 = myPackage.Workbook.Worksheets.Add("Sheet2"); | |
| ExcelWorksheet excelWorksheet3 = myPackage.Workbook.Worksheets.Add("Sheet3"); | |
| FileInfo f2 = new FileInfo(workingDir.FullName + "//" + "newfile.xlsm"); | |
| ExcelVBAModule excelVbaModule = myPackage.Workbook.VbaProject.Modules.AddModule("Module1"); | |
| StringBuilder mybuilder = new StringBuilder(); mybuilder.AppendLine("Sub Jiminy()"); | |
| mybuilder.AppendLine("Range(\"D6\").Select"); | |
| mybuilder.AppendLine("ActiveCell.FormulaR1C1 = \"Jiminy\""); | |
| mybuilder.AppendLine("End Sub"); | |
| excelVbaModule.Code = mybuilder.ToString(); | |
| myPackage.SaveAs(f2); | |
| myPackage.Dispose(); | |
| } | |
| [Ignore] | |
| [TestMethod] | |
| public void ReadVBAUnicodeWsName() | |
| { | |
| var package = new ExcelPackage(new FileInfo(@"c:\temp\bug\VbaUnicodeWS.xlsm")); | |
| File.WriteAllText(@"c:\temp\vba\modules\dir.txt", package.Workbook.VbaProject.CodePage + "," + package.Workbook.VbaProject.Constants + "," + package.Workbook.VbaProject.Description + "," + package.Workbook.VbaProject.HelpContextID.ToString() + "," + package.Workbook.VbaProject.HelpFile1 + "," + package.Workbook.VbaProject.HelpFile2 + "," + package.Workbook.VbaProject.Lcid.ToString() + "," + package.Workbook.VbaProject.LcidInvoke.ToString() + "," + package.Workbook.VbaProject.LibFlags.ToString() + "," + package.Workbook.VbaProject.MajorVersion.ToString() + "," + package.Workbook.VbaProject.MinorVersion.ToString() + "," + package.Workbook.VbaProject.Name + "," + package.Workbook.VbaProject.ProjectID + "," + package.Workbook.VbaProject.SystemKind.ToString() + "," + package.Workbook.VbaProject.Protection.HostProtected.ToString() + "," + package.Workbook.VbaProject.Protection.UserProtected.ToString() + "," + package.Workbook.VbaProject.Protection.VbeProtected.ToString() + "," + package.Workbook.VbaProject.Protection.VisibilityState.ToString()); | |
| foreach (var module in package.Workbook.VbaProject.Modules) | |
| { | |
| File.WriteAllText(string.Format(@"c:\temp\vba\modules\{0}.txt", module.Name), module.Code); | |
| } | |
| foreach (var r in package.Workbook.VbaProject.References) | |
| { | |
| File.WriteAllText(string.Format(@"c:\temp\vba\modules\{0}.txt", r.Name), r.Libid + " " + r.ReferenceRecordID.ToString()); | |
| } | |
| List<X509Certificate2> ret = new List<X509Certificate2>(); | |
| X509Store store = new X509Store(StoreLocation.CurrentUser); | |
| store.Open(OpenFlags.ReadOnly); | |
| package.Workbook.VbaProject.Signature.Certificate = store.Certificates[19]; | |
| //package.Workbook.VbaProject.Protection.SetPassword(""); | |
| package.SaveAs(new FileInfo(@"c:\temp\vbaSaved.xlsm")); | |
| } | |
| [TestMethod] | |
| public void CreateUnicodeWsName() | |
| { | |
| using (var package = new ExcelPackage()) | |
| { | |
| //ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Test"); | |
| ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("测试"); | |
| package.Workbook.CreateVBAProject(); | |
| var sb = new StringBuilder(); | |
| sb.AppendLine("Sub GetData()"); | |
| sb.AppendLine("MsgBox (\"Hello,World\")"); | |
| sb.AppendLine("End Sub"); | |
| ExcelWorksheet worksheet2 = package.Workbook.Worksheets.Add("Sheet1"); | |
| var stringBuilder = new StringBuilder(); | |
| stringBuilder.AppendLine("Private Sub Worksheet_Change(ByVal Target As Range)"); | |
| stringBuilder.AppendLine("GetData"); | |
| stringBuilder.AppendLine("End Sub"); | |
| worksheet.CodeModule.Code = stringBuilder.ToString(); | |
| package.SaveAs(new FileInfo(@"c:\temp\invvba.xlsm")); | |
| } | |
| } | |
| //Issue with chunk overwriting 4096 bytes | |
| [Ignore] | |
| [TestMethod] | |
| public void VbaBug() | |
| { | |
| using ( var package = new ExcelPackage(new FileInfo(@"c:\temp\bug\outfile.xlsm"))) | |
| { | |
| Console.WriteLine(package.Workbook.CodeModule.Code.Length); | |
| package.Workbook.Worksheets[1].CodeModule.Code = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)\r\n\r\nEnd Sub"; | |
| package.Workbook.Worksheets.Add("TestCopy",package.Workbook.Worksheets[1]); | |
| package.SaveAs(new FileInfo(@"c:\temp\bug\outfile2.xlsm")); | |
| } | |
| } | |
| [TestMethod] | |
| public void DecompressionChunkGreaterThan4k() | |
| { | |
| // This is a test for Issue 15026: VBA decompression encounters index out of range | |
| // on the decompression buffer. | |
| var workbookDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\workbooks"); | |
| var path = Path.Combine(workbookDir, "VBADecompressBug.xlsm"); | |
| var f = new FileInfo(path); | |
| if (f.Exists) | |
| { | |
| using (var package = new ExcelPackage(f)) | |
| { | |
| // Reading the Workbook.CodeModule.Code will cause an IndexOutOfRange if the problem hasn't been fixed. | |
| Assert.IsTrue(package.Workbook.CodeModule.Code.Length > 0); | |
| } | |
| } | |
| } | |
| } | |
| } |