0%

利用Excel对数据进行多表计算

  • 来源:明日科技
  • 利用Excel对数据进行多表计算


    实例说明

    本实例使用C#代码实现了利用Excel对数据进行多表计算的功能。运行本实例,如图1所示,首先单击上面工具栏中的“打开Excel模板”按钮,打开指定的Excel模板文件,并且选择要操作的工作表;然后在下面的工具栏中输入要计算的列和行,单击“合并计算”按钮,程序自动对Debug文件夹中的3个Excel文件进行合并计算,并体现在Excel模板文件中。

    图1 利用Excel对数据进行多表计算

    关键技术

    本实例在实现对多个Excel工作表中的内容进行计算时,首先需要有一个固定的模板,以便使用户知道要对哪行哪列数据进行计算,然后需要使用Microsoft Excel自动化对象模型中的Range对象(使用Worksheet对象的Cells属性获得)的Text属性获取Excel工作表中指定单元格的内容,最后将获取到的内容进行相加,并且写入汇总Excel文件的相应单元格中即可,下面对本实例中用到的关键技术进行详细讲解。
    (1)Worksheet对象的Cells属性 Worksheet对象是公开事件并用作控件的容器的Excel工作表对象,其Cells属性用来获取一个Range对象,该对象表示工作表上的所有单元格(不仅仅是当前正在使用的单元格)。Cells属性语法格式如下:
    [BrowsableAttribute(false)]
    public virtual Range Cells { get; }
    参数说明
    属性值:一个Range对象,表示工作表上的所有单元格(不仅仅是当前正在使用的单元格)。
    (2)Range对象的Text属性 Range对象的Text属性用来获取指定单元格中的内容,其语法格式如下:
    object Text {get;}
    参数说明
    属性值:指定单元格的内容。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为CalMultiSheet。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个ToolStrip控件,分别用来作为程序的两个工具栏,其中第一个工具栏用来选择Excel模板文件及其工作表,第二个工具栏用来输入要计算的列、行及执行合并计算操作;添加一个WebBrowser控件,用来显示Excel文件。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    private void CalcData(int P_int_Row, string P_str_Column)
    {
    CloseProcess("EXCEL"); //关闭所有Excel进程
    string P_str_workBook1 = Application.StartupPath + "\\\Excel1.xls"; //记录第一个要计算的工作簿路径
    string P_str_workBook2 = Application.StartupPath + "\\\Excel2.xls"; //记录第二个要计算的工作簿路径
    string P_str_workBook3 = Application.StartupPath + "\\\Excel3.xls"; //记录第三个要计算的工作簿路径
    string P_str_workBook4 = Application.StartupPath + "\\\Sum.xls"; //记录存储计算结果的工作簿路径
    object missing = System.Reflection.Missing.Value; //定义object缺省值
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel1 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel1.Visible = false;//设置Excel文件隐藏
    //打开第一个计算的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook1 = excel1.Workbooks.Open(P_str_workBook1, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要计算的第一个工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet1 = (Microsoft.Office.Interop.Excel._Worksheet)workbook1.Worksheets.get_Item(tscbox_Sheet.Text);
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel2 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel2.Visible = false;//设置Excel文件隐藏
    //打开第二个计算的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook2 = excel2.Workbooks.Open(P_str_workBook2, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要计算的第二个工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet2 = (Microsoft.Office.Interop.Excel._Worksheet)workbook2.Worksheets.get_Item(tscbox_Sheet.Text);
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel3 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel3.Visible = false;//设置Excel文件隐藏
    //打开第三个计算的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook3 = excel3.Workbooks.Open(P_str_workBook3, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要计算的第三个工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet3 = (Microsoft.Office.Interop.Excel._Worksheet)workbook3.Worksheets.get_Item(tscbox_Sheet.Text);
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel4 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel4.Visible = false;//设置Excel文件隐藏
    //打开存储计算结果的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook4 = excel4.Workbooks.Open(P_str_workBook4, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要存储结算结果的工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet4 = (Microsoft.Office.Interop.Excel._Worksheet)workbook4.Worksheets.get_Item(tscbox_Sheet.Text);
    excel4.DisplayAlerts = false; //设置保存Excel时不显示对话框
    worksheet4.Activate();//激活工作表
    Decimal P_dml_NumOne = 0; //获取第一个工作表的值
    Decimal P_dml_NumTwo = 0; //获取第二个工作表的值
    Decimal P_dml_NumThree = 0; //获取第三个工作表的值
    //判断指定单元格内容是否为空
    if (((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[P_int_Row, P_str_Column]).Text.ToString() == "" || ((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[P_int_Row, P_str_Column]).Text == null)
    {
    P_dml_NumOne = 0; //将第一个值设置为0
    }
    else
    {
    P_dml_NumOne = Convert.ToDecimal(((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[P_int_Row, P_str_Column]).Text); //记录第一个值
    }
    //判断指定单元格内容是否为空
    if (((Microsoft.Office.Interop.Excel.Range)worksheet2.Cells[P_int_Row, P_str_Column]).Text.ToString() == "" || ((Microsoft.Office.Interop.Excel.Range)worksheet2.Cells[P_int_Row, P_str_Column]).Text == null)
    {
    P_dml_NumTwo = 0; //将第二个值设置为0
    }
    else
    {
    P_dml_NumTwo = Convert.ToDecimal(((Microsoft.Office.Interop.Excel.Range)worksheet2.Cells[P_int_Row, P_str_Column]).Text); //记录第二个值
    }
    //判断指定单元格内容是否为空
    if (((Microsoft.Office.Interop.Excel.Range)worksheet3.Cells[P_int_Row, P_str_Column]).Text.ToString() == "" || ((Microsoft.Office.Interop.Excel.Range)worksheet3.Cells[P_int_Row, P_str_Column]).Text == null)
    {
    P_dml_NumThree = 0; //将第三个值设置为0
    }
    else
    {
    //记录第三个值
    P_dml_NumThree = Convert.ToDecimal(((Microsoft.Office.Interop.Excel.Range)worksheet3.Cells[P_int_Row, P_str_Column]).Text);
    }
    Decimal P_dml_Sum = P_dml_NumOne + P_dml_NumTwo + P_dml_NumThree;//计算总和
    try
    {
    //向工作簿的指定单元格中写入计算后的数据
    worksheet4.Cells[P_int_Row, P_str_Column] = P_dml_Sum.ToString();
    workbook4.Save(); //保存Excel文件
    }
    catch
    {
    MessageBox.Show("写入第" + P_int_Row.ToString() + "行,第" + P_str_Column + "列时出错!");
    }
    finally
    {
    workbook4.Save(); //保存Excel文件
    //退出打开的4个Excel文件
    excel1.Quit();
    excel2.Quit();
    excel3.Quit();
    excel4.Quit();
    }
    WBrowser_Excel.Navigate(P_str_workBook4); //在窗体中显示多表计算后的Excel文件
    }

    秘笈心法

    心法领悟050:如何在程序中打开Excel文件?
    打开Excel文件时,可以使用Workbooks对象的Open方法来实现,该方法的第一个参数为要打开的Excel文件,其他的参数表示Excel的相关设置,实际使用时,直接用Missing.Value的值来表示即可。
    例如,本实例中打开指定Excel工作表的实现代码如下:

    Microsoft.Office.Interop.Excel.Workbook workbook1 = excel1.Workbooks.Open(P_str_workBook1, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);

    觉得文章有用?请我喝杯咖啡~