protected void DoWriteDataTable(object dataSource, DataTableOptions options) { options ??= new DataTableOptions(); var book = options.Book?.Document ?? Document; options ??= new DataTableOptions(); var tableDataSource = GetDataSource(dataSource, new DataSourceParameters() { IgnoreErrors = options.IgnoreErrors, Columns = options.SelectColumns, SkipColumns = options.SkipColumns }); string htmlTable; using (var spreadsheet = SpreadsheetUtils.CreateWorkbook()) { Worksheet worksheet; using (new UsingProcessor( () => spreadsheet.BeginUpdate(), () => spreadsheet.EndUpdate())) { worksheet = spreadsheet.Worksheets[0]; var table = SpreadsheetUtils.AppendDataSource(worksheet, tableDataSource, true); if (!string.IsNullOrWhiteSpace(options.Formatting)) { var scanner = new Scanner(); var parser = new Parser(scanner); var tree = parser.Parse(options.Formatting); if (tree.Errors.Count > 0) { var strErrors = new StringBuilder(); foreach (var error in tree.Errors) { if (strErrors.Length > 0) { strErrors.AppendLine(); } strErrors.Append(error.Message); } throw new Exception(strErrors.ToString()); } List <BaseCommand> commands = null; try { commands = tree.Eval() as List <BaseCommand>; } catch (Exception) { //Do nothing, skip invalid commands } if (commands != null) { var gridData = new GridData(); gridData.ApplyGridFormatConditions(commands); SpreadsheetUtils.ApplyGridFormatting(table, gridData, false); } } if (options.CalculatedColumns != null && options.CalculatedColumns.Length > 0) { for (int i = 0; i < options.CalculatedColumns.Length; i++) { var calculatedColumn = options.CalculatedColumns[i]; if (string.IsNullOrWhiteSpace(calculatedColumn)) { continue; } var p = calculatedColumn.IndexOf('='); if (p < 0) { ReportError("Cannot add calculated column: cannot get column name. Calculated columns have format '[CalcColumn1]=[Column1]*[Column2]'."); continue; } var columnName = calculatedColumn[..(p - 1)].Trim();
public SCBook WriteDataTable(object dataSource, DataTableOptions options = null) { ExecuteSynchronized(options, () => DoWriteDataTable(dataSource, options)); return(this); }