コード例 #1
0
        private static void FillNamedCells(PostBody request, XLWorkbook wb)
        {
            foreach (var cellName in request.NamedCellValues.Keys)
            {
                var cell = wb.Cell(cellName);
                if (cell != null)
                {
                    var stringValue = request.NamedCellValues[cellName];

                    //For merging, this function is very eager to transform to
                    //decimal values. The formatting should be done by the sheet.
                    //You may require different behaviour
                    if (!Decimal.TryParse(stringValue,
                                          NumberStyles.AllowCurrencySymbol |
                                          NumberStyles.AllowThousands |
                                          NumberStyles.AllowDecimalPoint,
                                          new CultureInfo("en-US")
                                          , out var possibleDecimalValue))
                    {
                        cell.Value = stringValue;
                    }
                    else
                    {
                        cell.Value = possibleDecimalValue;
                    }
                }
            }
        }
コード例 #2
0
        private static void FillTables(PostBody request, XLWorkbook wb)
        {
            foreach (var requestWorksheet in request.Worksheets)
            {
                var worksheet = wb.Worksheets.FirstOrDefault(ws => ws.Name == requestWorksheet.Key);
                if (worksheet != null)
                {
                    foreach (var valueTable in requestWorksheet.Value.Tables)
                    {
                        var excelTable = worksheet.Tables.FirstOrDefault(t => t.Name == valueTable.Key);
                        if (excelTable != null)
                        {
                            //Excel is 1 based
                            //The table has a header, so row 2 is the first line of data
                            var currentExcelRow = 2;
                            for (int lineIndex = 0; lineIndex < valueTable.Value.Count; lineIndex++)
                            {
                                if (currentExcelRow <= valueTable.Value.Count)
                                {
                                    excelTable.Row(currentExcelRow).InsertRowsBelow(1);
                                    var range   = excelTable.Row(currentExcelRow).RangeAddress;
                                    var rowData = worksheet.Range(range);
                                    excelTable.Row(currentExcelRow + 1).Cell(1).Value = rowData;
                                }

                                var lineItem      = valueTable.Value[lineIndex];
                                var currentColumn = 1;
                                foreach (var tableCellValue in lineItem)
                                {
                                    var stringValue = tableCellValue;

                                    if (!Decimal.TryParse(stringValue,
                                                          NumberStyles.AllowCurrencySymbol |
                                                          NumberStyles.AllowThousands |
                                                          NumberStyles.AllowDecimalPoint,
                                                          new CultureInfo("en-US")
                                                          , out var possibleDecimalValue))
                                    {
                                        excelTable.Cell(currentExcelRow, currentColumn).Value = stringValue;
                                    }
                                    else
                                    {
                                        excelTable.Cell(currentExcelRow, currentColumn).Value = possibleDecimalValue;
                                    }

                                    currentColumn++;
                                }

                                //Don't insert a blank line at the end!
                                if (currentExcelRow <= valueTable.Value.Count)
                                {
                                    currentExcelRow++;
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #3
0
        public static Byte[] Merge(byte[] workbook, PostBody request)
        {
            using (var templateStream = new MemoryStream(workbook))
            {
                var wb = new XLWorkbook(templateStream);
                FillNamedCells(request, wb);
                FillTables(request, wb);

                using (var ms = new MemoryStream())
                {
                    wb.SaveAs(ms);
                    return(ms.ToArray());
                }
            }
        }