// 新規ワークブックの作成 var workbook = new GrapeCity.Documents.Excel.Workbook(); // テンプレートファイルを読み込む var templateFile = this.GetResourceStream("xlsx\\Template_SalesDataGroup_DataTable.xlsx"); workbook.Open(templateFile); #region データの初期化 Console.WriteLine("Creating test data."); var datasource = new System.Data.DataTable(); datasource.Columns.Add(new DataColumn("Area", typeof(string))); datasource.Columns.Add(new DataColumn("City", typeof(string))); datasource.Columns.Add(new DataColumn("Category", typeof(string))); datasource.Columns.Add(new DataColumn("Name", typeof(string))); datasource.Columns.Add(new DataColumn("Revenue", typeof(double))); var areas = new[] { "North America", "South America" }; var cities = new[] { "Chicago", "New York", "Santiago", "Quito", "Fremont", "Buenos Aires", "Medillin", "Minnesota" }; var categories = new[] { "Consumer Electronics", "Mobile" }; var category1NamePrefixes = new[] { "Bose ", "Canon ", "Haier ", "IFB ", "Mi ", "Sennheiser " }; var category2NamePrefixes = new[] { "iPhone ", "OnePlus ", "Redmi ", "Samsung " }; Random rand = new Random(); var rows = datasource.Rows; // コンピューター上のデモが速すぎる場合は、ループ数を増やすことができます。 for (var i = 0; i < 30000; i++) { var area = areas[rand.Next(0, areas.Length)]; var city = cities[rand.Next(0, cities.Length)]; var categoryId = rand.Next(0, categories.Length); var category = categories[categoryId]; var names = (categoryId == 0) ? category1NamePrefixes : category2NamePrefixes; var name = names[rand.Next(0, names.Length)] + rand.Next(10, 10000).ToString(); var revenue = rand.Next(10000, 100000); rows.Add(area, city, category, name, revenue); } #endregion // テンプレートのグローバル設定の初期化 workbook.Names.Add("TemplateOptions.KeepLineSize", "true"); // データソースの追加 workbook.AddDataSource("ds", datasource); // キャンセルキーが押されるか、タイムアウトに達するとキャンセルされます。 using (CancellationTokenSource cancellation = new CancellationTokenSource()) { void cancelHandler(object sender, ConsoleCancelEventArgs e) { // プロセス正常終了 e.Cancel = true; // 次の行は、ProcessTemplate が完了またはキャンセルされたときに cancelHandler に入ることを防ぎます。 // ただし、.NET Framework と .NET Core の一部の古いバージョンではデッドロックが発生します。(以下を参照) // https://github.com/dotnet/runtime/issues/24516#issuecomment-353967357 #if NETCOREAPP3_0_OR_GREATER Console.CancelKeyPress -= cancelHandler; #endif cancellation.Cancel(); }; Console.CancelKeyPress += cancelHandler; cancellation.CancelAfter(TimeSpan.FromSeconds(10)); Console.WriteLine("Start ProcessTemplate."); try { workbook.ProcessTemplate(cancellation.Token); Console.WriteLine("ProcessTemplate finished."); } catch (OperationCanceledException ex) when (ex.CancellationToken == cancellation.Token) { Console.WriteLine("ProcessTemplate was canceled."); } // 次の行は、ProcessTemplate が完了またはキャンセルされたときに cancelHandler に入ることを防ぎます。 // ただし、.NET Framework と .NET Core の一部の古いバージョンではデッドロックが発生します。(以下を参照) // https://github.com/dotnet/runtime/issues/24516#issuecomment-353967357 #if NETCOREAPP3_0_OR_GREATER Console.CancelKeyPress -= cancelHandler; #endif }
' 新規ワークブックの作成 Dim workbook As New Workbook ' テンプレートファイルを読み込む Dim templateFile = GetResourceStream("xlsx\Template_SalesDataGroup_DataTable.xlsx") workbook.Open(templateFile) #Region "データの初期化" Console.WriteLine("Creating test data.") Dim datasource As New DataTable With datasource.Columns .Add(New DataColumn("Area", GetType(String))) .Add(New DataColumn("City", GetType(String))) .Add(New DataColumn("Category", GetType(String))) .Add(New DataColumn("Name", GetType(String))) .Add(New DataColumn("Revenue", GetType(Double))) End With Dim areas = {"North America", "South America"} Dim cities = {"Chicago", "New York", "Santiago", "Quito", "Fremont", "Buenos Aires", "Medillin", "Minnesota"} Dim categories = {"Consumer Electronics", "Mobile"} Dim category1NamePrefixes = {"Bose ", "Canon ", "Haier ", "IFB ", "Mi ", "Sennheiser "} Dim category2NamePrefixes = {"iPhone ", "OnePlus ", "Redmi ", "Samsung "} Dim rand As New Random Dim rows = datasource.Rows ' コンピューター上のデモが速すぎる場合は、ループ数を増やすことができます。 For i = 1 To 30000 Dim area = areas(rand.Next(0, areas.Length)) Dim city = cities(rand.Next(0, cities.Length)) Dim categoryId = rand.Next(0, categories.Length) Dim category = categories(categoryId) Dim names = If(categoryId = 0, category1NamePrefixes, category2NamePrefixes) Dim name = names(rand.Next(0, names.Length)) & rand.Next(10, 10000) Dim revenue = rand.Next(10000, 100000) rows.Add(area, city, category, name, revenue) Next #End Region ' テンプレートのグローバル設定の初期化 workbook.Names.Add("TemplateOptions.KeepLineSize", "true") ' データソースの追加 workbook.AddDataSource("ds", datasource) ' キャンセルキーが押されるか、タイムアウトに達するとキャンセルされます。 Using cancellation As New CancellationTokenSource Dim cancelHandler As ConsoleCancelEventHandler = Sub(sender, e) ' プロセス正常終了 e.Cancel = True cancellation.Cancel() ' 次の行は、ProcessTemplate が完了またはキャンセルされたときに cancelHandler に入ることを防ぎます。 ' ただし、.NET Framework と .NET Core の一部の古いバージョンではデッドロックが発生します。 ' https://github.com/dotnet/runtime/issues/24516#issuecomment-353967357 #If NETCOREAPP3_0_OR_GREATER Then RemoveHandler Console.CancelKeyPress, cancelHandler #End If End Sub AddHandler Console.CancelKeyPress, cancelHandler cancellation.CancelAfter(TimeSpan.FromSeconds(10)) Console.WriteLine("Start ProcessTemplate.") Try workbook.ProcessTemplate(cancellation.Token) Console.WriteLine("ProcessTemplate finished.") Catch ex As OperationCanceledException When ex.CancellationToken = cancellation.Token Console.WriteLine("ProcessTemplate was canceled.") End Try ' 次の行は、ProcessTemplate が完了またはキャンセルされたときに cancelHandler に入ることを防ぎます。 ' ただし、.NET Framework と .NET Core の一部の古いバージョンではデッドロックが発生します。 ' https://github.com/dotnet/runtime/issues/24516#issuecomment-353967357 #If NETCOREAPP3_0_OR_GREATER Then RemoveHandler Console.CancelKeyPress, cancelHandler #End If End Using