文章分類/Infragistics
我們收到許多有關 Excel 和用於通過 Infragistics 控件導入/導出數據的文檔 API 的問題。 因此,在這篇文章中,我想解釋一下最近發布的 WebDataGrid控件。目前,內置不支持將內容導出到 Excel、PDF 和 XPS,但這可能是將來支持的功能之一。
現在,讓我們看看如何使用 Excel API 的 load 方法從 Excel 檢索數據並在 WebDataGrid 中顯示該數據。 將數據連接到網格後,您可以使用各種功能,例如過濾、排序和編輯。如果用戶想要導出顯示的數據,可以使用相同的 API Engine 導出編輯後的數據並以 Excel、PDF 或 XPS 格式查看。
導入數據
首先,分配一個局部變量。
//Create the temporary table to store data DataTable myDataTable = new DataTable(); DataColumn myDataColumn; DataRow myDataRow; //MIN/MAX Values used to frame the working size of the Excel data to be imported. 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。 此示例使用數據表。首先,您可以確定數據綁定和列結構,然後相應地構建數據對象的骨架。 您可以使用工作簿對象迭代行和列,並確定要加載到 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++) { //Get the column name string columnName = internalWorkBook.Worksheets["Customers"].Rows[minCellRow].Cells[ i].Value.ToString(); //The export that was demonstrated earlier utilizes the first row //for the column header. We can now use that to give column names. myDataColumn = new DataColumn(columnName); //Add the columns to the datatable. myDataTable.Columns.Add(myDataColumn); //Create WebDataGrid Columns and enable settings 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; } //Add The Row to a DataTable myDataTable.Rows.Add(myDataRow); }
DataTable 和 WebDataGrid 列已準備就緒。接下來,綁定到 WebDataGrid。
//Set the primary key so that the WebDataGrid can perform Auto Crud myDataTable.PrimaryKey = new DataColumn[] { myDataTable.Columns["CustomerID"] }; //ImportGrid below is the grid that we have on our page importGrid.DataSource = myDataTable; importGrid.DataBind();
注意:該代碼假定 XLS 文件位於服務器上,因此可以將其輸入 Excel 引擎並導入到 WebDataGrid 中。如果要擴展行為,比如在客戶端導入本地Excel文件,則需要在客戶端添加一次將文件上傳到服務器的功能。上傳到服務器後,您可以使用導入方法提取數據。
導出數據
使用API導出不同格式的數據的概念是相同的。首先,為文檔創建一個列結構,迭代 WebDataGrid 列並導出它們。接下來,迭代 WebDataGrid 的行以創建要導出的數據行。導出為任何格式的代碼幾乎相同,因此我將在此處使用導出為 Excel 作為示例。
首先,創建要將數據導出到的工作簿和工作表對象。創建輔助變量以進一步完成任務。
//Create workbook and worksheet object for Excel Workbook theWorkbook = new Workbook(); Worksheet theWorkSheet = theWorkbook.Worksheets.Add("WorkSheet1"); int iRow = 1; int iCell = 1;
下一步是迭代 WebDataGrid 列以在 Excel 工作表中創建一個列,並查找用於填充該列中的單元格的行。
//Iterate through the columns of the WebDataGrid and create // columns within the worksheet that will be exported. 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; //Now iterate through the grid rows to add rows to the worksheet foreach(GridRecord gridRecord in this.WebDataGrid1.Rows) { theWorkSheet.Rows[iRow].Cells[iCell].Value = gridRecord.Items[iCell-1].Text; iRow += 1; } iCell += 1; }
附加的示例包括用於在導出時格式化單元格的附加代碼。 創建工作表並導出數據後,您可以將 Excel 工作表寫入流以在客戶端上查看。
//Create the Stream class System.IO.MemoryStream theStream = new System.IO.MemoryStream(); //Write the in memory Workbook object to the Stream theWorkbook.Save(theStream); //Create a Byte Array to contain the stream and send the exported sheet to the client 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。