VSTO(C#)操作Excel数据透视表

3 篇文章 0 订阅

VSTO(C#)控制Excel操作透视表

1.首先新建一个 VSTO工作簿。

在这里插入图片描述

在这里插入图片描述

2.创建一个winform窗体
在这里插入图片描述

2.选择相应的统计要素,就可以在数据透视表呈现相应的统计效果,单位和维修人用","隔开表示查询多个(数据是从Sql server读出来的)
在操作的时候,顺便生成sql语句。

DateTime beginDate = dtpBeginDate.Value.AddDays(-(dtpBeginDate.Value.Day - 1));   //日期重置为1号
            DateTime endDate = dtpEndDate.Value.AddDays(-(dtpEndDate.Value.Day - 1));
            int betMons = (endDate - beginDate).Days;
			if (betMons < 0)
			{
				MessageBox.Show("结束年月小于开始年月", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
				return;
			}
			Excel.Worksheet sht = Globals.ThisWorkbook.Sheets["自定义报表"];
			Excel.PivotTable pivt = sht.PivotTables(1);
			sht.Application.DisplayAlerts = false;
			try
			{
				pivt.ClearTable();   //先把数据透视表清除
			}
			finally
			{
				sht.Application.DisplayAlerts = true;
			}
			List<string> condiction = new List<string>();
			Dictionary<string, object> dict = new Dictionary<string, object>();     //存储查询键值对
			dict.Add("@beginDate", beginDate.ToString("yyyy/M/1"));
			dict.Add("@endDate", endDate.ToString("yyyy/M/1"));
			if (betMons != 0)
			{
				Excel.PivotField pivtf = pivt.PivotFields("年月");
				pivtf.Orientation = Excel.XlPivotFieldOrientation.xlColumnField;
			}
			if (ckbCatagory.Checked)   //类别
			{
				Excel.PivotField pivtf = pivt.PivotFields("类别");
				pivtf.Orientation = Excel.XlPivotFieldOrientation.xlRowField;
				if (cbbCatagory.Text != "全部")
				{
					condiction.Add("catagory = @catagory");
					dict.Add("@catagory", cbbCatagory.Text);
				}
			}
			if (ckbDepartment.Checked)   //单位
			{
				Excel.PivotField pivtf = pivt.PivotFields("单位");
				pivtf.Orientation = Excel.XlPivotFieldOrientation.xlRowField;
				if (txbDepartment.Text != "")
				{
					List<string> orCdt = new List<string>();
					string[] deparments = txbDepartment.Text.Trim().Split(',');
					for (int i = 0; i < deparments.Length; i++)
					{
						orCdt.Add("department = @department" + i);
						dict.Add("@department" + i, deparments[i]);
					}
					condiction.Add("(" + string.Join(" or ", orCdt) + ")");
				}
			}
			if (ckbClerk.Checked)   //维修人
			{
				Excel.PivotField pivtf = pivt.PivotFields("维修人");
				pivtf.Orientation = Excel.XlPivotFieldOrientation.xlRowField;
				if (cbbCatagory.Text != "")
				{
					List<string> orCdt = new List<string>();
					string[] clerkNames = txbClerk.Text.Trim().Split(',');
					for (int i = 0; i < clerkNames.Length; i++)
					{
						orCdt.Add("clerk_name = @clerk_name" + i);
						dict.Add("@clerk_name" + i, clerkNames[i]);
					}
					condiction.Add("(" + string.Join(" or ", orCdt) + ")");
				}
			}

			if (ckbExpense.Checked)
				pivt.AddDataField(pivt.PivotFields("人工费"), "人工费用", Excel.XlConsolidationFunction.xlSum);
			if (ckbCertificate.Checked)
				pivt.AddDataField(pivt.PivotFields("维修单数量"), "单据数量", Excel.XlConsolidationFunction.xlSum);
			pivt.DataPivotField.Orientation = Excel.XlPivotFieldOrientation.xlRowField;

			string cdtStr = string.Join(" and ", condiction);
			string sql = "select id,t1.long_id as 编号, department as 单位, catagory as 类别, expense_date as 年月, clerk_name as 维修人, human_expense as 人工费, "
						+ "materials_expense as 材料费, certificate_count as 维修单数量 from tb_totalInfo as t1 inner join tb_human as t2"
						+ " on t1.long_id = t2.long_id where (expense_date between @beginDate and @endDate) and " + cdtStr;
			DataTable dt = SqlDataBaseOperator.GetDataSet(sql, dict).Tables[0];
			Globals.Sheet2.IsUpdate = false;
			try
			{
				Globals.Sheet2.listObject1.DataSource = dt;
				DataRefresh.FillColor(Globals.Sheet2.listObject1, 2);
			}
			finally
			{
				Globals.Sheet2.IsUpdate = true;
			}

			pivt.PivotCache().Refresh();
			sht.Visible = Excel.XlSheetVisibility.xlSheetVisible;
			sht.Activate();

			toolStripStatusLabel1.Text = "查询完成";
		}

效果:
查询技师以及职院在2018年11月到2018年12月水电类别的统计
在这里插入图片描述

查询郭靖以及黄蓉在技师2018年11月到2018年12月全部类别的统计
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# VSTO (Visual Studio Tools for Office) 是一种用于开发 Microsoft Office 应用程序的技术框架,其中包括 ExcelVSTO 提供了一组强大的工具和功能,使开发人员能够使用 C# 编程语言来创建自定义的 Excel 解决方案。 通过使用 C# VSTO,您可以利用 Excel 的功能和数据处理能力,以及自定义用户界面和业务逻辑,创建各种类型的 Excel 插件和扩展。以下是一些 C# VSTO 开发 Excel 的常见功能和用途: 1. 自定义功能:您可以使用 C# VSTO 创建自定义函数,以扩展 Excel 的内置函数库。这样,您可以根据特定需求创建自定义计算公式,并在 Excel 中使用它们。 2. 数据操作C# VSTO 允许您通过编程方式读取、写入和操作 Excel 工作簿中的数据。您可以使用 C# 代码来执行各种数据操作,如读取单元格值、设置单元格格式、创建图等。 3. 用户界面定制:通过 C# VSTO,您可以创建自定义的 Excel 用户界面,包括自定义的菜单、工具栏、任务窗格等。这样,您可以根据特定需求为用户提供更直观和易用的界面。 4. 事件处理:C# VSTO 允许您订阅 Excel 中的各种事件,如工作簿打开、单元格更改等。通过事件处理,您可以在特定事件发生时执行自定义的操作,以响应用户的操作或特定的工作簿状态。 5. 数据交互:C# VSTO 可以与其他数据源进行交互,如数据库、Web 服务等。您可以使用 C# 代码将 Excel 中的数据与其他系统进行集成和交互,实现数据的导入、导出和同步等功能。 总之,C# VSTO 提供了丰富的功能和灵活性,使开发人员能够以 C# 编程语言创建强大的 Excel 解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值