using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.Web; using System.Web.UI.DataVisualization.Charting; using System.Drawing; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; using Resources; using Weee.Models; using Weee.Models.ExtensionMethods; namespace Weee.Supports { public class ProductLCAInventoryExcelExporter : ExcelExporter { public void InsertCO2Data(IWorkbook workbook, ISheet sheet, ProductLCA productLca , out MemoryStream imageStream) { var grayColor = new XSSFColor(Color.LightGray); var orangeColor = new XSSFColor(Color.Orange); var greenColor = new XSSFColor(Color.Green); var orangeHeaderStyle = CreateCommonStyleWithBorder(workbook, orangeColor); var greenHeaderStyle = CreateCommonStyleWithBorder(workbook, greenColor); var grayHeaderStyle = CreateCommonStyleWithBorder(workbook, grayColor); var borderStyle = CreateCommonStyleWithBorder(workbook); var noneBorderStyle = CreateCommonStyleWithoutBorder(workbook); var currentRow = 0; InsertCO2InventoryCaption(sheet, productLca); SetCellStyle(sheet, noneBorderStyle, currentRow, currentRow, 0, 16); SetCellStyle(sheet, orangeHeaderStyle, currentRow, currentRow, 9, 12); SetCellStyle(sheet, greenHeaderStyle, currentRow, currentRow, 13, 16); currentRow++; string[] inventoryHeader = new string[] { Resource.Phase, Resource.Items, Resource.DataType, Resource.PartNumber, Resource.SupplierName, Resource.DescriptionAndExplanation, Resource.BomWeight, Resource.UnitFunctionProducts, Resource.DuringInterrogation, Resource.ScopeOnePrimaryData, Resource.ScopeTwoPrimaryData, Resource.ScopeThreePrimaryData, Resource.SumOfPrimaryPartsCarbonFootprint, Resource.SecondaryDataOfUnitPartProduction, Resource.LCAResultCO2, Resource.TransportainGToDCarbonEmission, Resource.SumOfSecondaryPartsCarbonFootprint, Resource.BomQuantity, Resource.PartsCarbonFootprint, Resource.UnitPartsWeightProportion, Resource.UnitPartsCarbonFootprintProportion }; InsertHorizontalHeader(sheet, currentRow, currentRow, 0, inventoryHeader); SetCellStyle(sheet, grayHeaderStyle, currentRow, currentRow, 0, inventoryHeader.Length - 1); currentRow++; var result1 = InsertCO2Inventory(sheet, productLca.Materials.ToList(), currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow + productLca.Materials.Count(), 0, inventoryHeader.Length - 1); currentRow += productLca.Materials.Count() + 3; string[] productCO2DataInManufacturingHeader = new string[] { Resource.ProductInManufacturingStage, Resource.Items, Resource.DataType, Resource.AssemblyFactoryName, Resource.MaterialPartNumber, Resource.ProductName, Resource.UnitFunctionProducts, Resource.DuringInterrogation, Resource.ScopeOnePrimaryData, Resource.ScopeTwoPrimaryData, Resource.ScopeThreePrimaryData, Resource.SumOfPrimaryManufacturingCarbonFootprint, Resource.SecondaryDataOfManufacturing, Resource.LCAResultCO2, Resource.SumOfSecondaryManufacturingCarbonFootprint, Resource.ManufacturingCarbonFootprint, Resource.RemarkOfDistributeDescription }; InsertHorizontalHeader(sheet, currentRow, currentRow, 0, productCO2DataInManufacturingHeader); SetCellStyle(sheet, grayHeaderStyle, currentRow, currentRow, 0, productCO2DataInManufacturingHeader.Length - 1); currentRow++; var result2 = InsertProductCO2DataInManufacturing(sheet, productLca, currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 0, productCO2DataInManufacturingHeader.Length - 1); currentRow += 3; string[] productCO2DataInDeliveryHeader = new string[] { Resource.ProductDeliveryStage, Resource.Items, Resource.DataType, Resource.AssemblyFactoryName, Resource.MaterialPartNumber, Resource.ProductName, Resource.UnitFunctionProducts, Resource.TransportainGToDCarbonEmission, Resource.ProductDeliveryCarbonFootprint }; InsertHorizontalHeader(sheet, currentRow, currentRow, 0, productCO2DataInDeliveryHeader); SetCellStyle(sheet, grayHeaderStyle, currentRow, currentRow, 0, productCO2DataInDeliveryHeader.Length - 1); currentRow++; var result3 = InsertProductCO2DataInDelivery(sheet, productLca, currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 0, productCO2DataInDeliveryHeader.Length - 1); currentRow += 3; string[] productCO2DataInUsageHeader = new string[] { Resource.ProductUsageStage, Resource.Items, Resource.PowerCoefficient, Resource.DuringInterrogation, Resource.ProductCarbonFootprint, Resource.PowerCoefficientSourceDescription }; InsertHorizontalHeader(sheet, currentRow, currentRow, 0, productCO2DataInUsageHeader); SetCellStyle(sheet, grayHeaderStyle, currentRow, currentRow, 0, productCO2DataInUsageHeader.Length - 1); currentRow++; var result4 = InsertProductCO2DataInUsage(sheet, productLca, currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 0, productCO2DataInUsageHeader.Length - 1); currentRow += 3; string[] greenhouseGasEmissionHeader = new string[] { Resource.Phase, Resource.ProductionAndTransportRawMaterial, Resource.ProductInManufacturingStage, Resource.ProductDeliveryStage, Resource.ProductUsageStage, Resource.AbandonedStage, Resource.ProductCarbonFootprint }; InsertHorizontalHeader(sheet, currentRow, currentRow, 0, greenhouseGasEmissionHeader); SetCellStyle(sheet, grayHeaderStyle, currentRow, currentRow, 0, greenhouseGasEmissionHeader.Length - 1); currentRow++; InsertGreenhouseGasEmission(productLca, result1, result2, result3, result4, sheet, currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 0, greenhouseGasEmissionHeader.Length - 1); currentRow += 3; string[] emissionPercentagePerPhaseHeader = new string[] { Resource.Phase, Resource.ProductionAndTransportRawMaterial, Resource.ProductInManufacturingStage, Resource.ProductDeliveryStage, Resource.ProductUsageStage, Resource.AbandonedStage, Resource.ProductCarbonFootprint }; InsertHorizontalHeader(sheet, currentRow, currentRow, 0, emissionPercentagePerPhaseHeader); SetCellStyle(sheet, grayHeaderStyle, currentRow, currentRow, 0, emissionPercentagePerPhaseHeader.Length - 1); currentRow++; InsertEmissionPercentagePerPhase(productLca, result1, result2, result3, result4, sheet, currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 0, emissionPercentagePerPhaseHeader.Length - 1); currentRow += 3; MemoryStream aa; InsertPercentageOfCarbonEmissionChart(workbook, sheet, productLca, result1, result2, result3, result4, currentRow, out aa); imageStream = new MemoryStream(); aa.Seek(0, SeekOrigin.Begin); aa.CopyTo(imageStream); } private void InsertCO2InventoryCaption(ISheet sheet, ProductLCA productLca) { var productName = productLca.TargetProduct != null ? productLca.TargetProduct.Name : ""; sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 1)); sheet.AddMergedRegion(new CellRangeAddress(0, 0, 2, 4)); sheet.AddMergedRegion(new CellRangeAddress(0, 0, 6, 8)); sheet.AddMergedRegion(new CellRangeAddress(0, 0, 9, 12)); sheet.AddMergedRegion(new CellRangeAddress(0, 0, 13, 16)); sheet.GetRow(0).GetCell(0).SetCellValue(Resource.MachineTypesOrSeriesOfProducts + " : " + productName); sheet.GetRow(0).GetCell(2).SetCellValue(Resource.DatabaseName + " : Simapro"); sheet.GetRow(0).GetCell(9).SetCellValue("Primary Data"); sheet.GetRow(0).GetCell(13).SetCellValue("Secondary Data"); } private decimal InsertCO2Inventory(ISheet sheet, List materials, int startRow) { decimal sumOfWeight = materials.Sum(x => x.Scalar); decimal sumOfScopeOnePrimaryFabKgCO2e = 0; decimal sumOfScopeTwoPrimaryFabKgCO2e = 0; decimal sumOfScopeThreePrimaryFabKgCO2e = 0; decimal sumOfPrimaryFabKgCO2e = 0; decimal sumOfSecondaryPartsProductionKgCO2e = 0; decimal sumOfLcaResultKgCO2e = 0; decimal sumOfTransportKgCO2e = 0; decimal sumOfSecondaryPartsKgCO2e = 0; int sumOfBomQuantity = 0; decimal sumOfTotalKgCO2e = materials.Sum(x => x.KgCO2e); sumOfLcaResultKgCO2e = sumOfPrimaryFabKgCO2e + sumOfSecondaryPartsProductionKgCO2e; sumOfSecondaryPartsKgCO2e = sumOfSecondaryPartsProductionKgCO2e + sumOfTransportKgCO2e; int row = startRow; int serialNumber = 1; foreach (var material in materials) { //land mine ! this is related to CarbonEmissionCalculator.GetSecondDataTypeOfPartsKgCO2e var isPrimary = material.RequestSent != null && material.RequestSent.AcceptReplyDate != null && material.RequestSent.RepliedByWhichLCA != null && material.RequestSent.RepliedByWhichLCA.SnapShotSurveyResult != null; var repliedLca = isPrimary ? material.RequestSent.RepliedByWhichLCA : null; var snapShotSurveyResult = isPrimary ? material.RequestSent.RepliedByWhichLCA.SnapShotSurveyResult : null; var constFactor = 1m;//secondary initial constFactor = isPrimary && (material.RequestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWorkHour) ? //by workhour snapShotSurveyResult.constantFactorInWorkHour.Value : constFactor; constFactor = isPrimary && (material.RequestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byArea) ?//by area snapShotSurveyResult.constantFactorInArea.Value : constFactor; constFactor = isPrimary && (material.RequestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWeight) ?//by weight snapShotSurveyResult.constantFactorInWeight.Value : constFactor; sheet.GetRow(row).GetCell(1).SetCellValue(serialNumber); string dataType = isPrimary ? "Primary" : "Secondary"; sheet.GetRow(row).GetCell(2).SetCellValue(dataType); sheet.GetRow(row).GetCell(3).SetCellValue(material.PartNumber); string supplierName = material.SupplierCompanyName; sheet.GetRow(row).GetCell(4).SetCellValue(supplierName); sheet.GetRow(row).GetCell(5).SetCellValue(material.Description); sheet.GetRow(row).GetCell(6).SetCellValue((double)material.Scalar); string unitFunctionalProduct = isPrimary ? material.RequestSent.DivideBy.DisplayString() : "PCS"; sheet.GetRow(row).GetCell(7).SetCellValue(unitFunctionalProduct); string duringInventory = isPrimary ? repliedLca.StartDate.ToShortDateString() + " ~ " + repliedLca.EndDate.ToShortDateString() : ""; sheet.GetRow(row).GetCell(8).SetCellValue(duringInventory); sheet.GetRow(row).GetCell(9).SetCellValue(isPrimary ? (snapShotSurveyResult.Scope1FabResult * constFactor).ToString() : ""); sheet.GetRow(row).GetCell(10).SetCellValue(isPrimary ? (snapShotSurveyResult.Scope2FabResult * constFactor).ToString() : ""); sheet.GetRow(row).GetCell(11).SetCellValue(isPrimary ? (snapShotSurveyResult.Scope3FabResult * constFactor).ToString() : ""); decimal tempm = 0; if (isPrimary) { tempm = (snapShotSurveyResult.Scope1FabResult + snapShotSurveyResult.Scope2FabResult + snapShotSurveyResult.Scope3FabResult) * constFactor; } //M sheet.GetRow(row).GetCell(12).SetCellValue(isPrimary ? tempm.ToString() : ""); decimal tempn = 0; if (isPrimary) { tempn = (snapShotSurveyResult.SecondaryWasteResult + snapShotSurveyResult.SecondaryWasteTransportResult) * constFactor + snapShotSurveyResult.SecondaryDirectMaterialResult + snapShotSurveyResult.SecondaryIndirectMaterialResult + snapShotSurveyResult.SecondaryWrapMaterialResult; } //N sheet.GetRow(row).GetCell(13).SetCellValue(isPrimary ? tempn.ToString() : ""); //O sheet.GetRow(row).GetCell(14).SetCellValue(isPrimary ? (tempm + tempn).ToString() : ""); //P var tempp = isPrimary?snapShotSurveyResult.SecondaryTransportResult:0m; sheet.GetRow(row).GetCell(15).SetCellValue(isPrimary ? tempp.ToString() : ""); var tempq = isPrimary?(tempn+tempp):material.KgCO2e; //Q sheet.GetRow(row).GetCell(16).SetCellValue(tempq.ToString()); //R sheet.GetRow(row).GetCell(17).SetCellValue(material.Quantity.ToString()); var temps = material.KgCO2e * material.Quantity; //S sheet.GetRow(row).GetCell(18).SetCellValue(temps.ToString()); //T decimal partsWeightProportion = sumOfWeight != 0 ? (material.Scalar / sumOfWeight) * 100 : 0; sheet.GetRow(row).GetCell(19).SetCellValue(Math.Round(partsWeightProportion, 8).ToString()); //U decimal partsTotalKgCO2eProportion = sumOfTotalKgCO2e != 0 ? (temps / sumOfTotalKgCO2e) * 100 : 0; sheet.GetRow(row).GetCell(20).SetCellValue(Math.Round(partsTotalKgCO2eProportion, 8).ToString()); row++; serialNumber++; } sheet.GetRow(row).GetCell(0).SetCellValue("Total"); sheet.GetRow(row).GetCell(6).SetCellValue(Math.Round((double)sumOfWeight, 8)); sheet.GetRow(row).GetCell(9).SetCellValue(Math.Round((double)sumOfScopeOnePrimaryFabKgCO2e, 8)); sheet.GetRow(row).GetCell(10).SetCellValue(Math.Round((double)sumOfScopeTwoPrimaryFabKgCO2e, 8)); sheet.GetRow(row).GetCell(11).SetCellValue(Math.Round((double)sumOfScopeThreePrimaryFabKgCO2e, 8)); sheet.GetRow(row).GetCell(12).SetCellValue(Math.Round((double)sumOfPrimaryFabKgCO2e, 8)); sheet.GetRow(row).GetCell(13).SetCellValue(Math.Round((double)sumOfSecondaryPartsProductionKgCO2e, 8)); sheet.GetRow(row).GetCell(14).SetCellValue(Math.Round((double)sumOfLcaResultKgCO2e, 8)); sheet.GetRow(row).GetCell(15).SetCellValue(Math.Round((double)sumOfTransportKgCO2e, 8)); sheet.GetRow(row).GetCell(16).SetCellValue(Math.Round((double)sumOfSecondaryPartsKgCO2e, 8)); sheet.GetRow(row).GetCell(17).SetCellValue(sumOfBomQuantity); sheet.GetRow(row).GetCell(18).SetCellValue(Math.Round((double)sumOfTotalKgCO2e, 8)); sheet.GetRow(row).GetCell(19).SetCellValue("100%"); sheet.GetRow(row).GetCell(20).SetCellValue("100%"); return sumOfTotalKgCO2e; } private decimal InsertProductCO2DataInManufacturing(ISheet sheet, ProductLCA productLca, int startRow) { var snapshot = productLca.SnapShotSurveyResult; var dataType = "Primary"; var fabName = productLca.TargetFab.Name; var productType = productLca.TargetProduct.SerialNumber; var productName = productLca.TargetProduct.Name; var unitFunctionProduct = "PCS"; var duringInventory = productLca.StartDate.ToShortDateString() + "~" + productLca.EndDate.ToShortDateString(); var scopeOneData = snapshot.Scope1FabResult * snapshot.constantFactorInWorkHour; var scopeTwoData = snapshot.Scope2FabResult * snapshot.constantFactorInWorkHour; var scopeThreeData = snapshot.Scope3FabResult * snapshot.constantFactorInWorkHour; var primaryData = scopeOneData + scopeThreeData + scopeTwoData; var secondaryDataOfManufacturing = (snapshot.SecondaryWasteResult + snapshot.SecondaryWasteTransportResult) * snapshot.constantFactorInWorkHour; var lcaResultCO2 = secondaryDataOfManufacturing + primaryData; var remarkOfDescription = "工時"; sheet.GetRow(startRow).GetCell(1).SetCellValue(1); sheet.GetRow(startRow).GetCell(2).SetCellValue(dataType); sheet.GetRow(startRow).GetCell(3).SetCellValue(fabName); sheet.GetRow(startRow).GetCell(4).SetCellValue(productType); sheet.GetRow(startRow).GetCell(5).SetCellValue(productName); sheet.GetRow(startRow).GetCell(6).SetCellValue(unitFunctionProduct); sheet.GetRow(startRow).GetCell(7).SetCellValue(duringInventory); sheet.GetRow(startRow).GetCell(8).SetCellValue(scopeOneData.HasValue?scopeOneData.Value.ToString() : ""); sheet.GetRow(startRow).GetCell(9).SetCellValue(scopeTwoData.HasValue ? scopeTwoData.Value.ToString() : ""); sheet.GetRow(startRow).GetCell(10).SetCellValue(scopeThreeData.HasValue ? scopeThreeData.Value.ToString() : ""); sheet.GetRow(startRow).GetCell(11).SetCellValue(primaryData.HasValue ? primaryData.Value.ToString() : ""); sheet.GetRow(startRow).GetCell(12).SetCellValue(secondaryDataOfManufacturing.ToString()); sheet.GetRow(startRow).GetCell(13).SetCellValue(lcaResultCO2.HasValue ? lcaResultCO2.Value.ToString() : ""); sheet.GetRow(startRow).GetCell(14).SetCellValue(secondaryDataOfManufacturing.ToString()); sheet.GetRow(startRow).GetCell(15).SetCellValue(lcaResultCO2.HasValue ? lcaResultCO2.Value.ToString() : ""); sheet.GetRow(startRow).GetCell(16).SetCellValue(remarkOfDescription); return lcaResultCO2.HasValue?lcaResultCO2.Value:0; } private decimal InsertProductCO2DataInDelivery(ISheet sheet, ProductLCA productLca, int startRow) { var snapshot = productLca.SnapShotSurveyResult; var dataType = "Secondary"; var fabName = productLca.TargetFab.Name; var productType = productLca.TargetProduct.SerialNumber; var productName = productLca.TargetProduct.Name; var unitFunctionProduct = "PCS"; var transportationDToGCarbonEmissions = "[ph]"; var productDeliveryCarbonFootprint = snapshot.SecondaryTransportResult; sheet.GetRow(startRow).GetCell(1).SetCellValue(1); sheet.GetRow(startRow).GetCell(2).SetCellValue(dataType); sheet.GetRow(startRow).GetCell(3).SetCellValue(fabName); sheet.GetRow(startRow).GetCell(4).SetCellValue(productType); sheet.GetRow(startRow).GetCell(5).SetCellValue(productName); sheet.GetRow(startRow).GetCell(6).SetCellValue(unitFunctionProduct); sheet.GetRow(startRow).GetCell(7).SetCellValue(transportationDToGCarbonEmissions); sheet.GetRow(startRow).GetCell(8).SetCellValue(productDeliveryCarbonFootprint.ToString()); return productDeliveryCarbonFootprint; } private decimal InsertProductCO2DataInUsage(ISheet sheet, ProductLCA productLca, int startRow) { var inventoryStageData = productLca.TargetInventoryStageData; var result = inventoryStageData.GetUsageStageCarbonFootprint(); sheet.GetRow(startRow).GetCell(0).SetCellValue(Resource.NonContinuousUsagePatterns); sheet.GetRow(startRow).GetCell(1).SetCellValue(1); sheet.GetRow(startRow).GetCell(2).SetCellValue(inventoryStageData != null ? Math.Round(inventoryStageData.ProductUsageStagePowerFactor, 2).ToString() : ""); sheet.GetRow(startRow).GetCell(3).SetCellValue(inventoryStageData != null ? Math.Round(inventoryStageData.GetUsageStageDuringInventory(), 2).ToString() : ""); sheet.GetRow(startRow).GetCell(4).SetCellValue(inventoryStageData != null ? Math.Round(result, 2).ToString() : ""); sheet.GetRow(startRow).GetCell(5).SetCellValue(inventoryStageData != null ? inventoryStageData.ProductUsageStageDescription : ""); return result; } private void InsertGreenhouseGasEmission(ProductLCA productLca, decimal materialProductionAndTransport, decimal productInManufacturingStage, decimal productInDeliveryStage, decimal productInUsageStage, ISheet sheet, int startRow) { var materials = productLca.Materials.ToList(); var inventoryStageData = productLca.TargetInventoryStageData; var productInAbandonedStage = inventoryStageData != null ? Math.Round(inventoryStageData.ProductAbandonedStageCarbonFootprint, 4) : 0; var productCarbonFootprint = materialProductionAndTransport + productInManufacturingStage + productInDeliveryStage + productInUsageStage + productInAbandonedStage; sheet.GetRow(startRow).GetCell(0).SetCellValue(Resource.GreenhouseGasEmissions); sheet.GetRow(startRow).GetCell(1).SetCellValue(materialProductionAndTransport.ToString()); sheet.GetRow(startRow).GetCell(2).SetCellValue(productInManufacturingStage.ToString()); sheet.GetRow(startRow).GetCell(3).SetCellValue(productInDeliveryStage.ToString()); sheet.GetRow(startRow).GetCell(4).SetCellValue(productInUsageStage.ToString()); sheet.GetRow(startRow).GetCell(5).SetCellValue(productInAbandonedStage.ToString()); sheet.GetRow(startRow).GetCell(6).SetCellValue(productCarbonFootprint.ToString()); } private void InsertEmissionPercentagePerPhase(ProductLCA productLca, decimal materialProductionAndTransport, decimal productInManufacturingStage, decimal productInDeliveryStage, decimal productInUsageStage, ISheet sheet, int startRow) { var materials = productLca.Materials.ToList(); var inventoryStageData = productLca.TargetInventoryStageData; var productInAbandonedStage = inventoryStageData != null ? Math.Round(inventoryStageData.ProductAbandonedStageCarbonFootprint, 4) : 0; var productCarbonFootprint = materialProductionAndTransport + productInManufacturingStage + productInDeliveryStage + productInUsageStage + productInAbandonedStage; var materialProductionAndTransportPercentage = productCarbonFootprint == 0 ? 0 : Math.Round((materialProductionAndTransport / productCarbonFootprint) * 100, 2); var productInManufacturingStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInManufacturingStage / productCarbonFootprint) * 100, 2); var productInDeliveryStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInDeliveryStage / productCarbonFootprint) * 100, 2); var productInUsageStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInUsageStage / productCarbonFootprint) * 100, 2); var productInAbandonedStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInAbandonedStage / productCarbonFootprint) * 100, 2); sheet.GetRow(startRow).GetCell(0).SetCellValue(Resource.Percentage); sheet.GetRow(startRow).GetCell(1).SetCellValue(materialProductionAndTransportPercentage.ToString() + "%"); sheet.GetRow(startRow).GetCell(2).SetCellValue(productInManufacturingStagePercentage.ToString() + "%"); sheet.GetRow(startRow).GetCell(3).SetCellValue(productInDeliveryStagePercentage.ToString() + "%"); sheet.GetRow(startRow).GetCell(4).SetCellValue(productInUsageStagePercentage.ToString() + "%"); sheet.GetRow(startRow).GetCell(5).SetCellValue(productInAbandonedStagePercentage.ToString() + "%"); sheet.GetRow(startRow).GetCell(6).SetCellValue("100%"); } public void InsertLCAData(IWorkbook workbook, ISheet sheet, ProductLCA productLca) { var borderStyle = CreateCommonStyleWithBorder(workbook); var currentRow = 1; string[] lcaHeader = new string[] { Resource.SupplierName, Resource.DistributionPrinciple, Resource.IndividualPartsByWeight, Resource.PartNumber, Resource.ScopeOnePrimaryData, Resource.ScopeTwoPrimaryData, Resource.ScopeThreePrimaryData, Resource.SumOfPrimaryData, Resource.MaterialDirectMaterial + "(kg co2)", Resource.MaterialIndirectMaterial + "(kg co2)", Resource.MaterialWrapMaterial + "(kg co2)", "LCA", Resource.TransportationCarbonEmission, Resource.WasteAndWasteTransportOfPartsManufacturing }; InsertHorizontalHeader(sheet, currentRow, currentRow, 1, lcaHeader); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 1, lcaHeader.Length); currentRow++; InsertLCAContent(sheet, productLca.Materials.ToList(), currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow + productLca.Materials.Count() - 1, 1, lcaHeader.Length); } private void InsertLCAContent(ISheet sheet, List materials, int startRow) { var row = startRow; foreach (var material in materials) { var repliedLca = material.RequestSent != null ? material.RequestSent.RepliedByWhichLCA : new ProductLCA(); var supplierName = material.RequestSent != null ? material.RequestSent.SenderCompanyName : ""; var distributePriciple = repliedLca != null && repliedLca.ProductProductionPcs.HasValue ? (decimal)repliedLca.ProductProductionPcs.Value : 0; var distributeKgCO2e = repliedLca != null && repliedLca.DistributeKgCO2eInWeight.HasValue ? (decimal)repliedLca.DistributeKgCO2eInWeight.Value : 0; var transportationKgCO2e = repliedLca != null ? repliedLca.TransportSheet.ToList().GetTotalKgCO2e() : 0; var wasteAndWasteTransportationKgCO2e = repliedLca != null ? repliedLca.WasteSheet.ToList().GetTotalKgCO2e() + repliedLca.WasteTransportSheet.ToList().GetTotalKgCO2e() : 0; sheet.GetRow(row).GetCell(1).SetCellValue(supplierName); sheet.GetRow(row).GetCell(2).SetCellValue(Math.Round(distributePriciple, 2).ToString()); sheet.GetRow(row).GetCell(3).SetCellValue(Math.Round(distributeKgCO2e, 2).ToString()); sheet.GetRow(row).GetCell(4).SetCellValue(material.PartNumber); sheet.GetRow(row).GetCell(5).SetCellValue(Math.Round(repliedLca.GetScopeOnePrimaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(6).SetCellValue(Math.Round(repliedLca.GetScopeTwoPrimaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(7).SetCellValue(Math.Round(repliedLca.GetScopeThreePrimaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(8).SetCellValue(Math.Round(repliedLca.GetPrimaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(9).SetCellValue(Math.Round(repliedLca.Materials.Where(x => x.MaterialType == MaterialType.DirectMaterial).ToList().GetTotalKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(10).SetCellValue(Math.Round(repliedLca.Materials.Where(x => x.MaterialType == MaterialType.IndirectMaterial).ToList().GetTotalKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(11).SetCellValue(Math.Round(repliedLca.Materials.Where(x => x.MaterialType == MaterialType.WrapMaterial).ToList().GetTotalKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(12).SetCellValue(Math.Round(repliedLca.Materials.GetTotalKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(13).SetCellValue(Math.Round(transportationKgCO2e, 2).ToString()); sheet.GetRow(row).GetCell(14).SetCellValue(Math.Round(wasteAndWasteTransportationKgCO2e, 2).ToString()); row++; } } public void InsertOnePointFiveData(IWorkbook workbook, ISheet sheet, ProductLCA productLca) { var borderStyle = CreateCommonStyleWithBorder(workbook); var currentRow = 1; string[] onePointFiveDataHeader = new string[] { Resource.ProjectName, Resource.Manufacturer, Resource.CommodityName, Resource.PartNumber, Resource.DuringInterrogation, Resource.LevelOneData, Resource.LevelTwoData, Resource.CarbonFootPrintResult, Resource.DistributionPrinciple, Resource.StaticLabelCertificationCompany }; InsertHorizontalHeader(sheet, currentRow, currentRow, 1, onePointFiveDataHeader); SetCellStyle(sheet, borderStyle, currentRow, currentRow, 1, onePointFiveDataHeader.Length); currentRow++; InsertOnePointFiveContent(sheet, productLca.Materials.ToList(), currentRow); SetCellStyle(sheet, borderStyle, currentRow, currentRow + productLca.Materials.Count() - 1, 1, onePointFiveDataHeader.Length); } private void InsertOnePointFiveContent(ISheet sheet, List materials, int startRow) { var row = startRow; foreach (var material in materials) { var projectName = 1; var repliedLca = material.RequestSent != null ? material.RequestSent.RepliedByWhichLCA : null; var supplierName = material.RequestSent != null ? material.RequestSent.SenderCompanyName : ""; var duringInventory = repliedLca != null ? repliedLca.StartDate + "~" + repliedLca.EndDate : ""; var productionPcs = repliedLca != null && repliedLca.ProductProductionPcs.HasValue ? (decimal)repliedLca.ProductProductionPcs.Value : 0; var verifyBy = repliedLca != null && repliedLca.VerifyBy != null ? repliedLca.VerifyBy.Name : ""; sheet.GetRow(row).GetCell(1).SetCellValue(projectName); sheet.GetRow(row).GetCell(2).SetCellValue(supplierName); sheet.GetRow(row).GetCell(3).SetCellValue(material.Name); sheet.GetRow(row).GetCell(4).SetCellValue(material.PartNumber); sheet.GetRow(row).GetCell(5).SetCellValue(duringInventory); sheet.GetRow(row).GetCell(6).SetCellValue(Math.Round(repliedLca.GetPrimaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(7).SetCellValue(Math.Round(repliedLca.GetSecondaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(8).SetCellValue(Math.Round(repliedLca.GetPrimaryFabKgCO2e() + repliedLca.GetSecondaryFabKgCO2e(), 2).ToString()); sheet.GetRow(row).GetCell(9).SetCellValue(Math.Round(productionPcs, 2).ToString()); sheet.GetRow(row).GetCell(10).SetCellValue(verifyBy); projectName++; row++; } } private void InsertPercentageOfCarbonEmissionChart(IWorkbook workbook, ISheet sheet, ProductLCA productLca, decimal materialProductionAndTransport, decimal productInManufacturingStage, decimal productInDeliveryStage, decimal productInUsageStage, int currentRow, out MemoryStream imageMemoryStream) { var materials = productLca.Materials.ToList(); var inventoryStageData = productLca.TargetInventoryStageData; var productInAbandonedStage = inventoryStageData != null ? Math.Round(inventoryStageData.ProductAbandonedStageCarbonFootprint, 4) : 0; var productCarbonFootprint = materialProductionAndTransport + productInManufacturingStage + productInDeliveryStage + productInUsageStage + productInAbandonedStage; var materialProductionAndTransportPercentage = productCarbonFootprint == 0 ? 0 : Math.Round((materialProductionAndTransport / productCarbonFootprint) * 100, 2); var productInManufacturingStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInManufacturingStage / productCarbonFootprint) * 100, 2); var productInDeliveryStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInDeliveryStage / productCarbonFootprint) * 100, 2); var productInUsageStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInUsageStage / productCarbonFootprint) * 100, 2); var productInAbandonedStagePercentage = productCarbonFootprint == 0 ? 0 : Math.Round((productInAbandonedStage / productCarbonFootprint) * 100, 2); var chart = new Chart(); chart.Height = 720; chart.Width = 1024; var chartArea = chart.ChartAreas.Add("PercentageOfCarbonEmission"); var series = chart.Series.Add("PercentageOfCarbonEmission"); series.ChartType = SeriesChartType.Pie; series.IsValueShownAsLabel = true; series.Points.Add((double)materialProductionAndTransportPercentage).Label = Resource.ProductionAndTransportRawMaterial + " " + materialProductionAndTransportPercentage + "%"; series.Points.Add((double)productInManufacturingStagePercentage).Label = Resource.ProductInManufacturingStage + " " + productInManufacturingStagePercentage + "%"; series.Points.Add((double)productInDeliveryStagePercentage).Label = Resource.ProductDeliveryStage + " " + productInDeliveryStagePercentage + "%"; series.Points.Add((double)productInUsageStagePercentage).Label = Resource.ProductUsageStage + " " + productInUsageStagePercentage + "%"; series.Points.Add((double)productInAbandonedStagePercentage).Label = Resource.AbandonedStage + " " + productInAbandonedStagePercentage + "%"; imageMemoryStream = new MemoryStream(); chart.SaveImage(imageMemoryStream, ChartImageFormat.Png); var patriarch = sheet.CreateDrawingPatriarch(); var anchor = new XSSFClientAnchor(0, 0, 0, 0, 0, currentRow + 1, 5, currentRow + 28); var pictureIndex = workbook.AddPicture(imageMemoryStream.ToArray(), PictureType.PNG); var signaturePicture = patriarch.CreatePicture(anchor, pictureIndex); } } }