public static void Encode(Workbook workbook, Stream stream) { List <Record> list = WorkbookEncoder.EncodeWorkbook(workbook); BinaryWriter binaryWriter = new BinaryWriter(stream); foreach (Record current in list) { current.Write(binaryWriter); } binaryWriter.Close(); }
private static Record EncodeImages(IList <Image> images) { MSODRAWINGGROUP mSODRAWINGGROUP = new MSODRAWINGGROUP(); MsofbtDggContainer msofbtDggContainer = new MsofbtDggContainer(); mSODRAWINGGROUP.EscherRecords.Add(msofbtDggContainer); MsofbtDgg msofbtDgg = new MsofbtDgg(); msofbtDgg.NumSavedDrawings = images.Count; checked { msofbtDgg.NumSavedShapes = images.Count + 1; msofbtDgg.MaxShapeID = 1024 + msofbtDgg.NumSavedShapes; msofbtDgg.GroupIdClusters.Add(1, msofbtDgg.NumSavedShapes); msofbtDggContainer.EscherRecords.Add(msofbtDgg); MsofbtBstoreContainer msofbtBstoreContainer = new MsofbtBstoreContainer(); msofbtBstoreContainer.Instance = (ushort)images.Count; foreach (Image current in images) { MsofbtBSE msofbtBSE = new MsofbtBSE(); msofbtBSE.UID = Guid.NewGuid(); msofbtBSE.Ref = 1; msofbtBSE.Version = 2; msofbtBSE.BlipRecord = WorkbookEncoder.CreateBlipRecord(current); msofbtBSE.BlipRecord.Type = current.Format; msofbtBSE.BlipRecord.ImageData = current.Data; msofbtBSE.BlipRecord.UID = msofbtBSE.UID; msofbtBSE.BlipRecord.Marker = 255; msofbtBSE.SetBlipType(current.Format); msofbtBstoreContainer.EscherRecords.Add(msofbtBSE); } msofbtDggContainer.EscherRecords.Add(msofbtBstoreContainer); MsofbtOPT msofbtOPT = new MsofbtOPT(); msofbtOPT.Add(PropertyIDs.FitTextToShape, 524296u); msofbtOPT.Add(PropertyIDs.FillColor, 134217793u); msofbtOPT.Add(PropertyIDs.LineColor, 134217792u); msofbtDggContainer.EscherRecords.Add(msofbtOPT); MsofbtSplitMenuColors msofbtSplitMenuColors = new MsofbtSplitMenuColors(); msofbtSplitMenuColors.Instance = 4; msofbtSplitMenuColors.Color1 = 134217741; msofbtSplitMenuColors.Color2 = 134217740; msofbtSplitMenuColors.Color3 = 134217751; msofbtSplitMenuColors.Color4 = 268435703; msofbtDggContainer.EscherRecords.Add(msofbtSplitMenuColors); return(mSODRAWINGGROUP); } }
private static List <Record> EncodeWorkbook(Workbook workbook) { SharedResource sharedResource = new SharedResource(true); List <Record> list = new List <Record>(); list.Add(new BOF { BIFFversion = 1536, StreamType = 5, BuildID = 3515, BuildYear = 1996, RequiredExcelVersion = 6u }); checked { list.Add(new CODEPAGE { CodePageIdentifier = (ushort)Encoding.Unicode.CodePage }); list.Add(new WINDOW1 { WindowWidth = 16384, WindowHeight = 8192, SelecteWorksheets = 1, TabBarWidth = 600, OptionFlags = 56 }); DATEMODE dATEMODE = new DATEMODE(); dATEMODE.Mode = 1; sharedResource.BaseDate = DateTime.Parse("1904-01-01"); list.Add(dATEMODE); List <List <Record> > list2 = new List <List <Record> >(); foreach (Worksheet current in workbook.Worksheets) { List <Record> list3 = WorkSheetEncoder.Encode(current, sharedResource); Record.EncodeRecords(list3); list2.Add(list3); } list.AddRange(sharedResource.FormatRecords.ToArray()); list.AddRange(sharedResource.ExtendedFormats.ToArray()); List <BOUNDSHEET> list4 = new List <BOUNDSHEET>(); foreach (Worksheet current in workbook.Worksheets) { BOUNDSHEET bOUNDSHEET = new BOUNDSHEET(); bOUNDSHEET.Visibility = 0; bOUNDSHEET.SheetType = 0; bOUNDSHEET.SheetName = current.Name; bOUNDSHEET.StreamPosition = 0u; list4.Add(bOUNDSHEET); list.Add(bOUNDSHEET); } if (sharedResource.Images.Count > 0) { list.Add(WorkbookEncoder.EncodeImages(sharedResource.Images)); } Record.EncodeRecords(list); int sstOffset = Record.CountDataLength(list); list.Add(sharedResource.SharedStringTable); list.Add(WorkbookEncoder.CreateEXTSST(sharedResource.SharedStringTable, sstOffset)); EOF item = new EOF(); list.Add(item); Record.EncodeRecords(list); int num = Record.CountDataLength(list); for (int i = 0; i < workbook.Worksheets.Count; i++) { list4[i].StreamPosition = (uint)num; list4[i].Encode(); int num2 = Record.CountDataLength(list2[i]); num += num2; } List <Record> list5 = new List <Record>(); list5.AddRange(list); foreach (List <Record> list3 in list2) { list5.AddRange(list3); } return(list5); } }