unit UExcel_Sum;
interface
//在接口部分定义使用系统的程序单元文件
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls, Buttons, Grids, DBGrids,
OleServer, Excel2000,ExtCtrls, DBCtrls;
//如果安装Delphi时,指定的不是Office 2000(如Office 97)
//则应指定Excel97,而不是Excel2000
type
TForm1 = class(TForm)
//如下定义本窗体使用的组件
TitleLabel: TLabel;
DataSource1: TDataSource;
Query1: TQuery;
//查询组件,完成数据库查询和工作量统计
DBGrid1: TDBGrid;
Query1SUMOF: TFloatField;
Query1SUMOF2: TFloatField;
Query1SUMOF3: TFloatField;
Query1BDEDesigner: TStringField;
YearComboBox: TComboBox;
//定义保存动态年度的组合框,供用户选择
SeasonComboBox: TComboBox;
//定义供用户选择季度、半年、全年的组合框
SeasonBtn: TBitBtn;
PrintBtn: TBitBtn;
YearBtn: TBitBtn;
CloseBtn: TBitBtn;
DBNavigator1: TDBNavigator;
procedure CloseBtnClick(Sender: TObject);
//定义事件处理过程,
procedure FormCreate(Sender: TObject);
procedure YearComboBoxChange(Sender: TObject);
procedure SeasonComboBoxChange(Sender: TObject);
procedure PrintBtnClick(Sender: TObject);
private
{ Private declarations }
//定义私有的全局变量,供各过程使用
year1,date1:string;
month1,month2:string;
XLApp:Variant;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
ComObj;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
//在窗体建立的过程中,获取计算机系统的当前时钟,并存入组合框中形成年度选择串
var
Year, Month, Day:Word;
//定义年、月、日变量
Present:TDateTime;
i:integer;
begin
Present:= Now;
//使用Now函数,获取系统日期和时间
DecodeDate(Present, Year, Month, Day);
//分解从系统获取的时间,即拆成年、月、日时间串
YearComboBox.items.clear;
YearComboBox.itemindex:=0;
YearComboBox.text:=inttostr(Year);
//指定当前年份
for i:=1 to 6 do
begin
YearComboBox.items.add(inttostr(year));
//形成年度下拉列表,从当前时间开始,最多6年
year:=year-1;
end;
year1:=YearComboBox.text;
//设置当前年份
month1:='01/01/';
month2:='12/31/';
date1:=''''+month1+year1+''' and '''+month2+year1+'''';
//形成查询条件的时间区间,
Query1.Close;
Query1.sql.clear;
Query1.sql.Add('Select 名称,sum(数量),sum(次数),sum(参加人次) from
GongZuoLiang where 时间 between  '+date1+' group by 名称 order by 名称');
//形成查询统计的SQL语句
Query1.open;
//从数据库统计数据
end;
procedure TForm1.SeasonComboBoxChange(Sender: TObject);
//当用户重新选择季度后,调用本过程。
begin
if SeasonComboBox.text='一季度' then
//当用户选择季度后,确定查询的月、日起止区间
begin
month1:='01/01/';
month2:='03/31/';
end;
if SeasonComboBox.text='二季度' then
begin
month1:='04/01/';
month2:='06/30/';
end;
if SeasonComboBox.text='三季度' then
begin
month1:='07/01/';
month2:='09/30/';
end;
if SeasonComboBox.text='四季度' then
begin
month1:='10/01/';
month2:='12/31/';
end;
if SeasonComboBox.text='上半年' then
//选择上半年后,确定查询的起止日期
begin
month1:='01/01/';
month2:='06/30/';
end;
if SeasonComboBox.text='全年' then
//选择全年后,确定查询的起止日期
begin
month1:='01/01/';
month2:='12/31/';
end;
date1:=''''+month1+year1+''' and '''+month2+year1+'''';
//重新合成动态查询的年、月、日的起止区间
Query1.Close;
Query1.sql.clear;
Query1.sql.Add('Select 名称,sum(数量),sum(次数),sum(参加人次) from
GZLiang  where 时间 between  '+date1+' group by 名称 order by 名称');
//根据新的条件,生成新的SQL语句
Query1.open;
end;
procedure TForm1.YearComboBoxChange(Sender: TObject);
//当用户重新选择年度后,调用本过程。
begin
year1:=YearComboBox.text;
date1:=''''+month1+year1+''' and '''+month2+year1+'''';
//根据用户选择的年度,重新生成查询条件
Query1.Close;
Query1.sql.clear;
Query1.sql.Add('Select 名称,sum(数量),sum(次数),sum(参加人次) from
GongZuoLiang  where 时间 between  '+date1+' group by 名称 order by 名称');
//根据新的查询条件,动态生成新的SQL语句
Query1.open;
end;
procedure TForm1.PrintBtnClick(Sender: TObject);
{当用户单击打印按钮后,调用该过程。其功能是:根据当前的查询条件,重新从数据库中查询和统计各项目的工作量,并将其存入Excel中,此外,可根据用户的需要对其进行修改、保存、打印等操作。}
var
i,j,k:integer;
Range1:Variant;
begin
Query1.close;
Query1.Open;
j:=Query1.RecordCount;
//获取查询和统计的记录总数,如果查询记录数>0,则启动Excel,拷贝数据输出和报表
if j>0 then
begin
k:=j+1;
XLApp:=CreateOleObject('Excel.Application');
//建立一个Excel应用的OLE对象
XLApp.Visible:=true;
//使得Excel对象可视
XLApp.Application.caption:='工作量统计';
//设置Excel应用的标题
XLApp.Workbooks.add(xlWBatWorkSheet);
//在Excel中,增加一个空白页
XLApp.Workbooks[1].WorkSheets[1].name:='工作量统计';
//设置工作簿中的工作表的名字
Range1:=XLApp.Workbooks[1].WorkSheets['工作量统计'].Range['A1:E'+inttostr(k)];
//设置工作表的存取范围
Range1.Borders.LineStyle:=xlContinuous;
//在工作表的范围内,增加表格线
//如下几行是设置工作表的表头
XLApp.Range('A1'):='  序号  ';
XLApp.Range('B1'):='      项  目  名  称    ';
XLApp.Range('C1'):='  数量  ';
XLApp.Range('D1'):='  次数';
XLApp.Range('E1'):='参加人次';
for i:=2 to j+1 do
//第1行为标题,从第2行起为表格的正式内容一次循环,填写一行表格的数据
begin
XLApp.cells[i,1]:=IntToStr(i-1);
XLApp.cells[i,2]:=Query1.fields[0].AsString;
//依次将字段值存入表中的各列
XLApp.cells[i,3]:=Query1.fields[1].value;
XLApp.cells[i,4]:=Query1.fields[2].value;
XLApp.cells[i,5]:=Query1.fields[3].value;
Query1.next;
end; //for i:=2
XLApp.Workbooks[1].WorkSheets[1].printout;
//完成表格生成后,打印输出
end;  // if j>0
XLApp.quit;
//释放OLE对象的Excel
end;
procedure TForm1.CloseBtnClick(Sender: TObject);
//当用户单击了关闭按钮后,调用该过程
begin
close;
//关闭窗体,终止应用程序的执行
end;
end.

以OLE方式建立与Excel连接相关推荐

  1. VS用OLE方式对Excel进行读写操作

    OLE技术(Object Linking and Embedding,对象连接与嵌入)OLE是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM). 一.Excel对象模型. Appl ...

  2. 以OLE方式读写EXCEL的C++类【转载】

    ◆C++中的[L"https://msdn.microsoft.com/library"]. 这个是C++标准规定的写法.详见以下链接: http://bbs.csdn.net/t ...

  3. LINQ TO SQL中还是用传统的连接串方式建立DbContext更好些

        首先,在LINQTOSQL中可以这样建立一个dbcontext      private TEntity GetOriginal(TEntity entity)         {       ...

  4. 通过OleDB连接方式,访问Access,Excel数据库.

    通过OleDB连接方式,访问Access,Excel数据库. OleDbConnectionStringBuilder oleConStr = new OleDbConnectionStringBui ...

  5. SSIS 错误代码 DTS_E_OLEDB_EXCEL_NOT_SUPPORTED 没有可用的 OLE DB 访问接口 SSIS 的 64 位版本中不支持 Excel 连接管理器...

    在Server 2008 R2的系统中,使用SQL安装包的BIDS(vs 08 shell)开发SSIS,按例子建好一个后,提示" SSIS 错误代码 DTS_E_OLEDB_EXCEL_N ...

  6. 一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...

    ​文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析 因为工作需要,每月周期性的更新数据和撰写PPT 报告成为繁重的劳动.结果是很多时间花费在数据处理上,真正的分析工作,往往只能草草收 ...

  7. excel 连接 mysql_使用 Excel 进行连接 - Azure SQL Database SQL Managed Instance | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 将 Excel 连接到 ...

  8. 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇

    1. 查看系统网络配置和当前TCP状态         在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...

  9. ESP8266 wifi模块连接上了热点之后 与服务器建立了tcp连接并进入了透传模式,如果关掉热点wifi模块的tcp连接没有切断,为什么

    ESP8266 wifi模块连接上了热点之后 与服务器建立了tcp连接并进入了透传模式,如果关掉热点wifi模块的tcp连接没有切断,为什么? 这个是很多开发者在第一次使用ESP8266模块是会出现的 ...

最新文章

  1. MLPerf基准测试再发榜,浪潮AI服务器刷新18项纪录
  2. 编写规范--Web前端开发修炼之道
  3. 最大公约数(Greatest_Common_Divisor)
  4. SAP Fiori里两种锁机制(lock)的实现
  5. ASP.NET Core 2.0 : 二. 开发环境
  6. Strom小实例,大小写转换
  7. java 正则表达式 替换括号,Java正则表达式:如何替换方括号内的所有字符?
  8. 10 有关业务/事件类型WQ在年2021的号码范围不存在
  9. 用winformz时间格式不正确_霜冻不可怕,用生态防寒布正确预防减少损失
  10. Web前端三大主流框架是什么?Web前端前景与就业形势
  11. (8)Powershell中变量的定义和使用
  12. OO思想(只留做自己看理解)
  13. 探索在Android中使用Emoji Font的方法
  14. WIN7护眼颜色设置
  15. CQC认证与3C认证的区别是什么
  16. 什么叫智能服务器sn,一篇文章告诉你何为服务器端车牌智能识别
  17. 手机打开html没有图片,网页看不到图片怎么办?图片打不开的解决办法
  18. 微信公众号页面中监听手机“返回”,并回到公众号里
  19. 不会用PS、Excel更改证件照颜色没关系,用Word更改不用1分钟!
  20. 星球前线 | Libra最大的竞争对手是什么?Calibra高管给出答案

热门文章

  1. 先进先出置换算法(Java实现)
  2. 谷歌被墙,怎样给谷歌浏览器加入迅雷下载插件
  3. 手机即时通服务器地址修改,手机即时通服务器地址修改
  4. iOS 越狱之后无法查看private、var等文件
  5. chat聊天机器人调研资料汇总
  6. 树莓派4b学习笔记(1)—— 4B介绍
  7. GEE:使用Sentinel-2数据做基于NDVI的长势监测(求5年影像集的NDVI均值,和当前年份的NDVI,两个影像做数学运算)
  8. Spring Boot||html页面的css等资源加载失败
  9. sipML5实现语音信息服务
  10. maven仓库配置及搜索顺序