| 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); |
| } |
| } |
| } |
| } |
| } |