我制作了一个程序,可以导入excel文件,并在动态添加的标签页中插入所有工作表,并附带动态添加的数据网格视图。
我想根据我在组合框中选择的选项卡插入KPI列的值,每次更改标签页时,组合框也会更改。
以下是我的代码:
public static void ReadExcel(ComboBox cboSheet, TabControl tabCon)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files| *.xls; *xlsx";
openFileDialog.ShowDialog();
if (!string.IsNullOrEmpty(openFileDialog.FileName))
{
OleDbcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + openFileDialog.FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'");
OleDbcon.Open();
DataTable dt = OleDbcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
OleDbcon.Close();
cboSheet.Items.Clear();
int width = 1330;
int height = 565;
//1338, 590
for (int i = 0; i < dt.Rows.Count; i++)
{
if (!dt.Rows[i]["Table_Name"].ToString().Contains("FilterDatabase") && !dt.Rows[i]["Table_Name"].ToString().EndsWith("$'"))
{
String sheetName = dt.Rows[i]["Table_Name"].ToString();
sheetName = sheetName.Substring(0, sheetName.Length - 1);
//cboSheet.Items.Add(sheetName);
TabPage tp = new TabPage(sheetName);
DataGridView dataGridView = new DataGridView();
tp.Controls.Add(dataGridView);
tabCon.Controls.Add(tp);
CreateDataGrid(dataGridView, sheetName);
dataGridView.Size = new Size(width, height);
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle = new System.Windows.Forms.DataGridViewCellStyle();
//KPI Column
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public static void CreateDataGrid(DataGridView dataGridView1, string TabName)
{
OleDbDataAdapter oleAdapt = new OleDbDataAdapter("Select * from [" + TabName + "$]", ExcelMethods.OleDbcon);
DataTable dt = new DataTable();
oleAdapt.Fill(dt);
dataGridView1.DataSource = dt;
}
答案 0 :(得分:0)
下面是一个简单的win form程序,它演示了我在评论中描述的内容。表单包含一个名为ComboBox
的空cb_KPI
。此外,它还包含一个名为TabControl
的空tabControl1
。
创建全局变量AllDataTables
。 AlldataTables
是DataSet
,DataTable
中的每个DataSet
都是用户选择的Excel工作簿中的现有工作表。这用于保存每个DataTable
的{{1}} ...,TabPage
是AllDataTables.Tables[0]
的{{1}}。
加载表单后,DataTable
将填充用户选择的工作簿的工作表...然后,遍历所有表的循环会为每个表的tabControl1.TabPages[0]
添加新的AllDataTables
。最后,TabPage
组合框会更新,以包含当前所选tabControl1
的值。
cb_KPI
TabPage
方法从用户选择的Excel文件中返回DataSet AllDataTables;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
AllDataTables = GetDSFromExcel();
foreach (DataTable dt in AllDataTables.Tables) {
tabControl1.TabPages.Add(GetTabPageWithGrid(dt));
}
cb_KPI.DataSource = SetKPI_ValuesForComboBox(AllDataTables.Tables[tabControl1.SelectedIndex]);
}
,其中GetDSFromExcel
中的每个DataSet
都是用户选择的Excel文件中的工作表。
DataTable
DataSet
方法获得private DataSet GetDSFromExcel() {
DataSet ds = new DataSet();
try {
OpenFileDialog openFileDialog = new OpenFileDialog {
Filter = "Excel Files| *.xls; *xlsx"
};
openFileDialog.ShowDialog();
if (!string.IsNullOrEmpty(openFileDialog.FileName)) {
using (OleDbConnection OleDbcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + openFileDialog.FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'")) {
OleDbcon.Open();
DataTable WorkbookSheetInfo = OleDbcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
String sheetName;
DataTable dt;
OleDbDataAdapter oleAdapt;
for (int i = 0; i < WorkbookSheetInfo.Rows.Count; i++) {
if ((WorkbookSheetInfo.Rows[i]["Table_Name"].ToString().EndsWith("$'")) ||
(WorkbookSheetInfo.Rows[i]["Table_Name"].ToString().EndsWith("$"))) {
sheetName = WorkbookSheetInfo.Rows[i]["Table_Name"].ToString();
dt = new DataTable(sheetName.Replace("'", "").Replace("$", ""));
oleAdapt = new OleDbDataAdapter("Select * from [" + sheetName + "]", OleDbcon);
oleAdapt.Fill(dt);
ds.Tables.Add(dt);
}
}
}
}
}
catch (Exception e) {
MessageBox.Show("ReadExcelIntoDS_Error" + e.ToString());
}
return ds;
}
并返回GetTabPageWithGrid
个DataTable
,TabPage
DataGridView
将DataGridView
是给定的DataSource
DataTable
接下来是在用户选择其他标签页时保持private TabPage GetTabPageWithGrid(DataTable dt) {
TabPage tp = new TabPage(dt.TableName.Replace("'", "").Replace("$", ""));
tp.Controls.Add(GetDGV(dt));
return tp;
}
private DataGridView GetDGV(DataTable dt) {
return new DataGridView {
Size = new Size(1000, 400),
Name = "datagridView" + dt.TableName,
DataSource = dt,
ScrollBars = ScrollBars.Both
};
}
组合框一致的所需代码。在这里联系cb_KPI
TabControls
事件可能会有所帮助,代码只是遍历SelectedIndexChanged
并收集所有不同的“KPI”字符串值并将它们存储到DataTable
中然后返回完成的列表。然后,此新列表将用作List<string>
组合框的DataSource
。显然,如果cb_KPI
很大或有许多不同的表,您可以考虑保存这些字符串列表,而不是每次用户选择不同的选项卡时重新生成列表。注意:下面的代码假定表中有一列名为“KPI”。
DataTable
我希望这会有所帮助。