上一節留了個尾巴,沒有說如何獲取表格的尺寸。其實表格尺寸的計算在讀取Excel工作表數據時就應該進行,同時進行的還有計算包含數據的單元格的最大列號和行號。
具體實現是:
- for (int r = rowRange.Count; r >= 1; r--)
- {
- XmlElement row_elem = xml.CreateElement("ROW");
- double rowHeight = 18.5f;
- for (int c = 1; c < colRange.Count; c++)
- {
- if (data[r, c] != null)
- {
- ....
- // 獲取行列號
- cell_elem.SetAttribute("row", r.ToString());
- cell_elem.SetAttribute("col", c.ToString());
- // 計算合併和普通單元格的尺寸
- if ((bool)cell.MergeCells)
- {
- Excel.Range ma = (Excel.Range)cell.MergeArea;
- Excel.Range macol = ma.Columns;
- Excel.Range marow = ma.Rows;
- // 獲取合併屬性
- ...
- // 獲取合併區域的尺寸
- cell_elem.SetAttribute("width", ma.Width.ToString() + "pt");
- cell_elem.SetAttribute("height", ma.Height.ToString() + "pt");
- // 更新本行的最大高度
- if ((double)ma.Height > rowHeight) rowHeight = (double)ma.Height;
- // 釋放
- ...
- }
- else
- {
- // 非合併單元格
- cell_elem.SetAttribute("colspan", "1");
- cell_elem.SetAttribute("rowspan", "1");
- cell_elem.SetAttribute("width", cell.Width.ToString() + "pt");
- cell_elem.SetAttribute("height", cell.Height.ToString() + "pt");
- if ((double)cell.Height > rowHeight) rowHeight = (double)cell.Height;
- }
- row_elem.AppendChild(cell_elem);
- if (r > maxRow) maxRow = r; // 更新最大行號
- if (c > maxCol) maxCol = c; // 更新最大列號
- // 釋放
- ....
- } // if has data
- } // for c
- if (row_elem.ChildNodes.Count > 0 || sheet_elem.ChildNodes.Count > 0)
- {
- row_elem.SetAttribute("height", rowHeight.ToString() + "pt"); // 這裏設置行高
- sheet_elem.InsertBefore(row_elem, sheet_elem.FirstChild);
- }
- } // for r
- sheet_elem.SetAttribute("row", maxRow.ToString()); // 保存最大行列號,也就是工作表實際有數據的區域
- sheet_elem.SetAttribute("col", maxCol.ToString());
- { // 這段代碼描述如何獲取工作表指定範圍的尺寸
- Excel.Range borderCell = (Excel.Range)range.get_Item(maxRow, maxCol); // 獲取最右下的單元格
- // 獲取其尺寸作爲工作表的尺寸,注意:未考慮如果該單元格是否合併的問題,留待同學的課後作業
- sheet_elem.SetAttribute("width", ((double)borderCell.Left + (double)borderCell.Width).ToString());
- sheet_elem.SetAttribute("height", ((double)borderCell.Top + (double)borderCell.Height).ToString());
- releaseComObject(borderCell); // 收尾工作
- borderCell = null;
- }
有了工作表的尺寸,就可以設置TabPanel的尺寸了:
- panel.ID = "Panel" + m;
- // 這裏設置TabPanel的尺寸
- panel.Attributes.Add("Width", sheet_node_list[m].Attributes["width"].Value);
- panel.Attributes.Add("Height", sheet_node_list[m].Attributes["height"].Value);
- // 這裏獲取工作表的最大行列號
- int _rowNum = Math.Max(1, int.Parse(sheetNodes[m].Attributes["row"].Value) + 1);
- int _colNum = Math.Max(1, int.Parse(sheetNodes[m].Attributes["col"].Value) + 1);
在向表格填充單元格和數據的時候,設置表格的尺寸:
- protected void fillTableData(Table tbl, int _rowNum, int _colNum, XmlNode sheet_node)
- {
- tbl.Attributes.Add("cellpadding", "0");
- tbl.Attributes.Add("cellspacing", "0");
- tbl.Style.Add("border-collapse", "collapse");
- tbl.Style.Add("table-layout", "fixed");
- // 還記得這一行嗎?設置表格的寬度
- tbl.Style.Add("width", sheet_node.Attributes["width"].Value + "pt");
- tbl.Style.Add("border", "1px solid black");
- ....
還需要設置TabContainer的屬性: 在屬性面板中,清空Width和Height,設置ScrollBars爲"Auto"。 這樣就可以看到比較完美的界面了,如果不對,請仔細檢察代碼,並嘗試其它不同的屬性值。