我目前正在构建一个小型C#应用,可以让用户将一些数据从Excel转换为另一种工作表中的另一种视图。
在此数据中,有一个层次结构:Entity > Sector > Sub-Sector > Zone > ... > Room
(" ......"意味着最多可以有3个额外的未命名步骤)
如您所见,数据基于颜色,Orange是实体,~Gray是扇区,蓝色是子扇区,白色是房间。
当用户加载Excel文件时,它还会将Worksheet名称作为实体加载并将它们添加到TreeView中;这是如何:
private void BT_load_Click(object sender, EventArgs e)
{
Tools.SelectExcelFile(OF_xls);
try
{
xlApp = new Excel.Application();
xlWorkbook = xlApp.Workbooks.Open(LB_path.Text, 3, 1);
Template_Metro test = new Template_Metro();
foreach(Excel.Worksheet wSheet in xlWorkbook.Worksheets)
{
test.Entites.Add(new Entite(wSheet.Name));
}
foreach(Entite entite in test.Entites)
{
myTreeView.Nodes.Add(entite.Nom);
}
}
catch(Exception x)
{
Tools.ErrorBox(x);
}
}
在加载操作之后,用户在TreeView中选择一个节点(我们将使用CoeurDePole作为示例),并在图片上提示选择黑框中的内容。
当用户在Excel上选择数据并单击Create
按钮时,应使用相应的层次结构更新树。
//IN THE FORM CLASS
private void BT_create_Click(object sender, EventArgs e)
{
if (myTreeView.SelectedNode != null)
{
Excel.Range selection = xlApp.Selection;
Tools.AddNodes(selection, myTreeView);
}
else
{
MessageBox.Show("Sélectionnez une entité dans laquelle ajouter les données", "Erreur");
}
}
//IN THE STATIC TOOLS CLASS
public static void AddNodes(Excel.Range selectedCells,
TreeView treeView)
{
List<Color> colors = GetColors(selectedCells);
try
{
/*
* This creates simple nodes within the selected node
* foreach (Excel.Range cell in selection.Cells)
* {
* treeView.SelectedNode.Nodes.Add(((Excel.Range)cell).Value2.ToString());
* }
*/
}
catch
{
MessageBox.Show("Aucunes cellules sélectionnées!", "Erreur");
}
}
public static List<Color> GetColors(Excel.Range selection)
{
List<Color> colors = new List<Color>();
Color color;
foreach (Excel.Range selectionCell in selection.Cells)
{
color = ColorTranslator.FromOle(Convert.ToInt32(selectionCell.Interior.Color));
if (colors.Contains(color) == false)
{
colors.Add(color);
}
}
return colors;
}
我还创建了与Entity,Sector ...对应的简单类,每个类都包含来自较低级别层次结构的对象列表。 (例如,类实体包含一个扇区列表)。
提前感谢您提供的任何帮助,我不需要C#答案,但非常感谢一些算法帮助。 :)
艾略特