blob: ca71265983b34b963a48ba48773981041d5eddf9 [file] [log] [blame]
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);
}
}
}
}
}