wincc 中怎么做才能把报表生成按日期的Excel 文件 
VBS脚本实现,就是把文件名称以变量的形式表示。参考
'关闭保存
Dim patch,filename
filename=CStr(Year(Now))&CStr(Month(Now))&CStr(Day(Now))&CStr(Hour(Now))+CStr(Minute(Now))&CStr(Second(Now))
patch= "d:\"&filename&"demo.xls"
objExcelApp.ActiveWorkbook.SaveAs patch
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp= Nothing
对于Excel报表,用VBS最灵活,Excel 定义好格式后wincc来填空,平均累计值就用Excel 的功能。
Dim excelapp
Dim aa,bb,cc
Set excelapp = CreateObject("Excel.Application")
Set aa = HMIRuntime.tags("tag1")
excelapp.visible = False'True
excelapp.workbooks.open "D:\excel.xls"
bb = Now 'getcurrent_datetime()
aa.Read
MsgBox CStr(bb)
lls(1,1).value = "rrrrrr"'111111
lls(1,2).value = CStr(bb)
lls(2,2).value = CStr(aa.value)
lls(3,2).value = CInt(aa.value)
lls(4,2).value = CSng(aa.value)
lls(5,2).value = CDbl(aa.value)
lls(6,2).value = CLng(aa.value)
lls(3,3).value = ScreenItems("33").outputvalue
lls(4,4).value = ScreenItems("35").outputvalue
cc = "D:\excel" + Mid(CStr(bb), 1, 4)+ Mid(CStr(bb), 6, 2)+ Mid(CStr(bb), 9, 2)+ Mid(CS
tr(bb), 12, 2)+ Mid(CStr(bb), 15, 2)+ Mid(CStr(bb), 18, 2) + ".xls"
MsgBox cc
excelapp.DisplayAlerts = False '对打开的文件,直接保存时,避免弹出对话框窗口,而是直接覆

excelapp.activeworkbook.saveas cc '根据当前日期时间,另存为新的文件
'excelapp.activeworkbook.save ’对打开的文件,直接保存
'excelapp.activeworkbook.saveAs "D:\excelcopy.xls" ’直接另存为新的文件
excelapp.workbooks.close
excelapp.quit
httP://ssyway.blog.sohu
Set excelapp = Nothing
这个报表的数据采集没有难度;唯一的难度在于4倒后,每个月班的出勤日是不一样的,这样对
于月报来说,计算出本月每个班的出勤日是需要些算法的。这个报表用WinCC完全可以实现。关键就
是如何存储数据。
方法一 WinCC 支持VBS 脚本,其实通过VBS VB本质是没有区别的,都是通过ADO 方式,存储数据 
式化数据的存储。WinCC的用户归档说白了 就是WinCC提供的一个操作数据库表的工具。我们可以
通过用户归档,创建数据库表。然后存储数据。显示的话通过报表系统的连接外部ODBC数据库,通过
SQL 脚本格式化输出。就ok了。
方法二这个报表的关键就在于如何确定班别和数据之间的关系。四班三运转在连续生产的行业是很常
见的。
首先确定班别和数据的对应关系。
WinCC 归档的方式中有一种是通过事件触发的。
那么我们可以通过不同的用户登录来确定归档的启动或者停止,
WinCC中对应一个变量可以生成几个归档变量,那么我们就能确定班次和数据的关系。比如:一个变
A,在归档中我们可以建两个归档变量和它对应,一个是aa,一个是bbA班用户登录时启动aa
归档,停止bb 的归档;B班用户登录时启动bb 归档,停止aa 归档,依次类推。
至于得到数据的方法,可以使用WinCC的标准归档查询实现。数据的显示,通过WinCC 报表的变量直
接连接显示。
觉得和VB相比,方法各有千秋。但是这样就省去了多加一个应用程序了。
WinCC里面做复杂报表的方法。WinCC 自带的报表编辑器确实功能有限,还好WinCC 本身功能是强大
的,可以通过脚本来完成复杂报表功能。目前我也是这么做的。报表的思路如下:
1、用excel我们也做一个符合自己实际需要报表(日报)的空白模板,我称它为Day_Report.xls
相信各位大侠的excel表格都比我做的精美;我不懂关系数据库,但各位大侠肯定比我精通excel 
httP://ssyway.blog.sohu
单元格之间的加、减、乘、除,甚至更加复杂的运算,并把运算结果放在你需要放置的单元格内,关
系数据之间的运算,要在excel模板里面预先设置好。我们要充分利用excel强大的数据处理能力!!!
2、在WinCC 里面写一个全局脚本,在每天的00:00:01触发,执行复制Day_Report.xls并以此刻
的年月日加载到模板文件名里面,将复制新生产的“Day_Report年月日.xls”存盘到你指定的目录。
这样当天的空白日报文件也就有了。全局脚本代码如下:(本人测试通过,仅供参考)
#include "apdefap.h"
int gscAction( void )
{
#pragma code ("kernel32.dll")//调用动态链接库
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
#pragma code("Shell32.dll")//调用动态链接库
VOID ShellExecuteA(HWND, LPCTSTR , LPCTSTR , LPCTSTR , LPCTSTR , INT);
#pragma code()
char FileName[30] = ""; char DateTime[30] = "";
SYSTEMTIME sysTime;
__object* pExcel = NULL; //建立 pExcel 指针 用来对 EXCEL 进行操作
HWND handle=NULL;
handle=FindWindow(NULL,"WinCC-运行系统 - ");
GetLocalTime(&sysTime);
sprintf(FileName,"d:\\Day_Report_%02d-%02d-%02d.xls",sysTime.wYear,sysTime.wMonth,sysTi
me.wDay);
pExcel = __object_create("Excel.Application");
pExcel->Visible = 0;//控制生成的excel vbs脚本怎么停止文件是否可见,,生成excel文件时可见.
pExcel->Workbooks ->Open ("d:\\Day_Report.XLS");
pExcel->ActiveWorkbook->SaveAs(FileName);//存盘
//pExcel->ActiveWorkbook->PrintPreview();//可以预览
//pExcel->ActiveWorkbook->PrintOut();//直接打印
pExcel->Workbooks->Close();//关闭文件
pExcel->Quit();//退出Excel
__object_delete(pExcel);
return 0;
}
3、再写一个全局脚本,整点触发,把你需要记录的变量写到“Day_Report年月日.xls”相应的单
元格里面并存盘;这样就完成了报表的数据存储和打印。也就是说,我们可以在电脑里面存放一份报
表,并打印一份报表。同样也实现了数据的存储。
相关脚本代码如下:(当时是以分钟来做测试的,仅供参考;注意此段代码缺少对其它excel进程的
判断,在此脚本执行前,不要有其它excel应用!切记哦!!!呵呵。)
#include "apdefap.h"
int gscAction( void )
{
int i;
#pragma code ("kernel32.dll")//调用动态链接库
httP://ssyway.blog.sohu
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
#pragma code("Shell32.dll")//调用动态链接库
VOID ShellExecuteA(HWND, LPCTSTR , LPCTSTR , LPCTSTR , LPCTSTR , INT);
#pragma code()
char FileName[30] = "";
SYSTEMTIME sysTime;
__object* pExcel = NULL; //建立 pExcel 指针 用来对 EXCEL 进行操作
HWND handle=NULL;
handle=FindWindow(NULL,"WinCC-运行系统 - ");
GetLocalTime(&sysTime);
//***********************************
SetTagWord("Minute",sysTime.wMinute);
i=GetTagWord("Minute")+3;
if (i>26) { GetTagWord("Minute") ;}
else if (i<=26)
{
sprintf(FileName,"d:\\Day_Report_%02d-%02d-%02d.xls",sysTime.wYear,sysTime.wMonth,sysTi
me.wDay);
pExcel = __object_create("Excel.Application");
pExcel->Visible = 0;//控制生成的excel 文件是否可见,,生成excel文件时可见.
pExcel->Workbooks ->Open (FileName);
pExcel->Worksheets("sheet1")->Range("X1")->Value=GetTagChar("@ServerName");//Return-Typ
e: char* 读取当前计算机名
pExcel->Worksheets("sheet1")->Range("X2")->Value=GetTagChar("@CurrentUser");//Return-Ty
pe: char* 读取当前操作员
pExcel->Worksheets("sheet1")->Cells(6,i)->Value=GetTagChar("TAG1");
pExcel->Worksheets("sheet1")->Cells(7,i)->Value=GetTagFloat("TAG2");
pExcel->Worksheets("sheet1")->Cells(8,i)->Value=GetTagFloat("TAG3");
pExcel->Worksheets("sheet1")->Cells(9,i)->Value=GetTagFloat("TAG4");
pExcel->Worksheets("sheet1")->Cells(10, i)->Value=GetTagFloat("TAG5");
pExcel->Worksheets("sheet1")->Cells(11, i)->Value=GetTagFloat("TAG6");
pExcel->ActiveWorkbook->Save;//As(FileName);//存盘~
//pExcel->ActiveWorkbook->PrintPreview();//可以预览
//if (i>=27) { pExcel->ActiveWorkbook->PrintOut(); }//直接打印
pExcel->Workbooks->Close();//关闭文件
pExcel->Quit();//退出Excel
__object_delete(pExcel);
}
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。