元記事 (英語): Murtaza Abdeali - http://community.infragistics.com/aspnet/articles/webdatagrid-import-data-from-excel-amp-export-to-excel-pdf-or-xps.aspx
インフラジスティックス コントロールでデータのインポート/エクスポートをする際に使用する Excel や Document API についての多くのご質問が寄せられています。そこで、この記事では、最近リリースされたばかりの WebDataGrid コントロールについてご説明しようと思います。 現在、Excel、PDF、XPS へのコンテンツのエクスポートはビルトインではサポートされていませんが、将来サポートされていく機能の 1 つだと思われます。
さて、Excel API の load メソッドを使用して Excel からデータを取得し、そのデータを WebDataGrid で表示する方法を見てみましょう。 データがグリッドへ接続されると、フィルタリング、並べ替え、編集など、さまざまな機能が使用できるようになります。 ユーザーが表示されているデータをエクスポートしたい場合は、同じ API Engine を使用して編集されたデータをエクスポートし、Excel、 PDF または XPS 形式で表示できます。
データのインポート
はじめにローカル変数を割り当てます。
//データを保存するための一時テーブルを作成します
DataTable myDataTable = new DataTable(); DataColumn myDataColumn; DataRow myDataRow; //インポートされる Excel データのサイズをフレームするために MIN/MAX を使用します
int minCellRow = Int32.MaxValue; int maxCellRow = Int32.MinValue; int minCellColumn = Int32.MaxValue; int maxCellColumn = Int32.MinValue;
次に NorthWind 顧客データを含む Excel シートを使用して、Excel API の Load メソッドを呼び出してデータを読み込み、データセットを構成します。
Workbook internalWorkBook = Workbook.Load(Request.PhysicalApplicationPath + "Northwind.xls");
Load メソッドは Excel コンテンツを読み込み、Excel ワークブック オブジェクトを返します。 ワークブックが返されたら、データが含まれるワークシートを検索してデータ オブジェクトを構成することができます。このデータ オブジェクトを WebDataGrid へバインドします。
この例では、DataTable を使用します。 まず、データのバインドおよび列の構造を決め、それに従って、データ オブジェクトの骨組みを作成することができます。 ワークブック オブジェクトを使用して行と列を反復し、WebDataGrid へ読み込むワークシートのセルの最大/最小を確定できます。
foreach (Infragistics.Excel.WorksheetRow row in internalWorkBook.Worksheets["Customers"].Rows) { foreach (Infragistics.Excel.WorksheetCell cell in row.Cells) { if (cell.Value != null) { //Logic For Determining the Range of Rows/Columns in the Excel File. minCellRow = Math.Min(minCellRow, cell.RowIndex); maxCellRow = Math.Max(maxCellRow, cell.RowIndex); minCellColumn = Math.Min(minCellColumn, cell.ColumnIndex); maxCellColumn = Math.Max(maxCellColumn, cell.ColumnIndex); } } }
ワークシートの構造情報を集めたら、データベースに行を作成すると同時に WebDataGrid の列を構成できます。 ここでインポートしない列または作成する WebDataGrid の列でプロパティを設定しない列の編集および削除ができます。
for (int i = minCellColumn; i <= maxCellColumn; i++) { //列名を取得します string columnName = internalWorkBook.Worksheets["Customers"].Rows[minCellRow].Cells[ i].Value.ToString(); //エクスポートの例では列ヘッダーの最初の行を利用しました //ここでは列に名前を付けます
myDataColumn = new DataColumn(columnName); //データベースに列を追加します
myDataTable.Columns.Add(myDataColumn); //列を作成し、設定を有効にします
BoundDataField bdf = new BoundDataField(true); bdf.DataFieldName = columnName; bdf.Key = columnName; bdf.Header.Text = columnName; bdf.Width = Unit.Pixel(100); importGrid.Columns.Add(bdf); }
最後にワークシートから DataTable へデータをプッシュします
for (int rowIndex = minCellRow + 1; rowIndex <= maxCellRow; rowIndex++) { //Create a new DataRow myDataRow = myDataTable.NewRow(); //Loop through the columns and associate the value to each cell for (int columnIndex = minCellColumn; columnIndex <= maxCellColumn; columnIndex++) { myDataRow[columnIndex] = internalWorkBook.Worksheets["Customers"].Rows[rowIndex].Cells[columnIndex].Value; } //DataTable に行を追加します myDataTable.Rows.Add(myDataRow); }
DataTable と WebDataGrid 列の準備ができました。次は WebDataGrid へバインドします。
//プライマリ キーを設定して WebDataGrid で Auto Crud を処理します
myDataTable.PrimaryKey = new DataColumn[] { myDataTable.Columns["CustomerID"] }; //以下の ImportGrid はページにあるグリッドです importGrid.DataSource = myDataTable; importGrid.DataBind();
ソースコードを含むサンプルは、この記事の最後にあるリンクからダウンロードできます。
注 :コードは XLS ファイルがサーバーにあると仮定するため、 Excel Engine へフィードして WebDataGrid へデータをインポートできます。 クライアントでローカルの Excel ファイルをインポートするなどの動作を拡張する場合は、クライアントでファイルを一度サーバーへアップロードする機能を追加する必要があります。 サーバーへアップロードされたら、import メソッドを使用してデータを抽出できます。
データのエクスポート
API を使用してさまざまな形式でのデータ エクスポートのコンセプトは同じです。 まず WebDataGrid 列を反復してエクスポートするドキュメントの列構造を作成します。次にWebDataGrid の行を反復してエクスポートするデータの行を作成します。 どの形式でエクスポートする場合もコードはほとんど同じなため、ここでは Excel へのエクスポートを例として紹介します。すべての形式が含まれるコードは以下のリンクからダウンロードできます。
まず、データをエクスポートするワークブックとワークシートのオブジェクトを作成します。更にタスクを達成するためのヘルパー変数を作成します。
//Excel にワークブックとワークシート オブジェクトを作成します
theWorkbook = new Workbook(); Worksheet theWorkSheet = theWorkbook.Worksheets.Add("WorkSheet1"); int iRow = 1; int iCell = 1;
次は WebDataGrid 列を反復して Excel シートの列を作成し、その列のセルを埋めるために行を検索します。
//WebDataGrid の列を反復してエクスポートされるワークシートの列を作成します foreach(GridField gridField in this.WebDataGrid1.Columns) { iRow = 1; theWorkSheet.Rows[iRow].Cells[iCell].Value = gridField.Header.Text; theWorkSheet.Columns[iCell].Width = 5000; iRow += 1; //グリッド行を往復してワークシートに行を追加します
foreach(GridRecord gridRecord in this.WebDataGrid1.Rows) { theWorkSheet.Rows[iRow].Cells[iCell].Value = gridRecord.Items[iCell-1].Text; iRow += 1; } iCell += 1; }
添付のサンプルには、エクスポートでセルを書式化するための追加コードが含まれます ワークシートを作成してデータをエクスポートしたら、Excel シートをストリームへ書き込んでクライアントで表示できます。
//Stream クラスを作成します
System.IO.MemoryStream theStream = new System.IO.MemoryStream(); //Workbook オブジェクトのメモリから Stream へ書き込みます theWorkbook.Save(theStream); //ストリームを含む Byte Array を作成し、エクスポートされたシートをクライアントへエクスポートします byte[] byteArr = (byte[])Array.CreateInstance(typeof(byte), theStream.Length); theStream.Position = 0; theStream.Read(byteArr, 0, (int)theStream.Length); theStream.Close(); Response.Clear(); Response.AddHeader("content-disposition", "attachment; filename=ExportedTo.xls"); Response.BinaryWrite(byteArr); Response.End();
完成です! 上記コード サンプルに弊社製品に含まれる API を使用して、Excel からのデータ インポート、更にデータを Excel, PDF または XPS へのエクスポートが可能になります。 以下のリンクから、このチュートリアルで使用したソースコードをダウンロードできます。
ソースコード: ExportWebDataGridContents.zip
注: サンプルでは 2008 Volume 3 コントロール セットおよび C# を使用しています。
弊社の API はコントロールやコンポーネントと直接接続していません。必要に応じてカスタム エクスポートに使用できます。 API を使用したその他の例は以下のリソースをご覧ください。
Manually Create Excel Files (英語)
Coloring Keywords in your Excel Worksheet (英語)
Export WinChart to Excel (英語)
Export WinTree to Excel (英語)