导出Excel时发生错误:
检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。
具体解决方法如下:
1、在服务器上安装office的Excel软件。
2、在"开始"->"运行"中输入dcomcnfg,启动"组件服务"
3、“组件服务”窗口中找到,"组件服务"->"计算机"->"我的电脑"->"DCOM配置" ,再在"DCOM配置"中找到"Microsoft Excel 应用程序",右键->属性,弹出"Microsoft Excel 应 用程序属性"对话框,对话框中设置以下几点:
(1)"标识"标签,选择"交互式用户" ,
(2)"安全"标签,在"启动和激活权限"上点"自定义",添加“NETWORK SERVICE”用户,并给它赋予"本地启动"和"本地激活"权限.
(3)"安全"标签,"访问权限"上点击"自定义",添加“NETWORK SERVICE”用户,赋予"本地访问"权限。
这样我们便配置好了相应的Excel的DCOM权限
注意:这是在WIN2003上配置的,在2000上,可能是配置的是ASPNET用户。
以上方法仅适用在32位系统下,如果是win7或win2008的64位系统,设置方法如下:
1、在"开始"->"运行"中输入dcomcnfg -32,启动"组件服务" (注意:这里要加 -32 参数,否则看不到Microsoft Excel Application项)
2、同上面步聚(3)一样的设置
3、在IIS7.5中,选择网站对应的应用程序池中的“高级设置”,在出现的对话框“进程”一节中的“标识”一项,改为“NetworkService”,确定保存。
因为要动态填加表格行,于是我用了jquery下的append(text)函数,为了代码排版美观,我在里面加入了相应的空格,因此引来了一场悲剧。
$("#tableId").append(" <tr><td> </td></tr> ");
以上语句在IE8、Chrome等浏览器下正常工作,但是在IE6下不正确,点击添加行时无效,也没有提示错误。
绕了一个大圈,查了很多地方,甚至将jquery升级为最新版本都不能解决问题。
后来无意中将代码里面用于排版的空格去掉,奇迹就这么发生了,问题解决,真是坑爹啊。
正确的代码为:
$("#tableId").append("<tr><td> </td></tr>");
在Web系统中调用Excel操作后,关闭Excel进程是个老问题
试了几种方法都无效,最后还是得采用kill进程的方案,不过跟强行kill所有Excel进程相比,下面的方案更为合理。
程序只kill当前对象相应的Excel进程。
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
int lpdwProcessId;
GetWindowThreadProcessId(new IntPtr(app.Hwnd), out lpdwProcessId);
System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
特此备忘,省得以后碰到同类问题,又是一通google。
C++ 输入输出 C# |
API与C#的数据类型对应关系表 | |||||
| API数据类型 | 类型描述 | C#类型 | API数据类型 | 类型描述 | C#类型 |
| WORD | 16位无符号整数 | ushort | CHAR | 字符 | char |
| LONG | 32位无符号整数 | int | DWORDLONG | 64位长整数 | long |
| DWORD | 32位无符号整数 | uint | HDC | 设备描述表句柄 | int |
| HANDLE | 句柄,32位整数 | int | HGDIOBJ | GDI对象句柄 | int |
| UINT | 32位无符号整数 | uint | HINSTANCE | 实例句柄 | int |
| BOOL | 32位布尔型整数 | bool | HWM | 窗口句柄 | int |
| LPSTR | 指向字符的32位指针 | string | HPARAM | 32位消息参数 | int |
| LPCSTR | 指向常字符的32位指针 | String | LPARAM | 32位消息参数 | int |
| BYTE | 字节 | byte | WPARAM | 32位消息参数 | int |
Wtypes.h 中的非托管类型 | 非托管 C 语言类型 | 托管类名 | 说明 |
HANDLE | void* | System.IntPtr | 32 位 |
BYTE | unsigned char | System.Byte | 8 位 |
SHORT | short | System.Int16 | 16 位 |
WORD | unsigned short | System.UInt16 | 16 位 |
INT | int | System.Int32 | 32 位 |
UINT | unsigned int | System.UInt32 | 32 位 |
LONG | long | System.Int32 | 32 位 |
BOOL | long | System.Int32 | 32 位 |
DWORD | unsigned long | System.UInt32 | 32 位 |
ULONG | unsigned long | System.UInt32 | 32 位 |
CHAR | char | System.Char | 用 ANSI 修饰。 |
LPSTR | char* | System.String 或System.StringBuilder | 用 ANSI 修饰。 |
LPCSTR | Const char* | System.String 或System.StringBuilder | 用 ANSI 修饰。 |
LPWSTR | wchar_t* | System.String 或System.StringBuilder | 用 Unicode 修饰。 |
LPCWSTR | Const wchar_t* | System.String 或System.StringBuilder | 用 Unicode 修饰。 |
FLOAT | Float | System.Single | 32 位 |
DOUBLE | Double | System.Double | 64 位 |
假设我们有这样一个需求,我要拿到所有培训学校,每个月培训人数,如下图的交叉统计表

交叉表在水晶报表中的实现非常简单,这里不再说明。
好,现在需求来了,客户要求可以看到各个培训学校每个月的培训学员名单。
此时我们就需要加入一个超级链接到上面的交叉表中,当用户点击其中一格统计数字时,能跳到另一个学员清单的界面。而在链接中我们需要把培训学校的ID和月份ID作为参数传到新页面。
链接制作方法:
在水晶报表设计界面,如下图的“合计”单元格中点右键,选择“设置对象格式”
在出现的窗口中选择“超级链接”选项卡
选择“Internet上的网站”,然后删除“网站地址”中内容,再点击右边红圈中的图标进入公式工作室

这里就是本文的重点,如何在链接中使用交叉表的汇总字段值,如培训学校ID和月份,
如果我们简单的将“报表字段”中内容拖入编辑框中,我们最终得到的结果是所有链接的所有值都是相同的,不会随着行列的变化发生变化。
示例公式:
公式中的JXTJ.ds_BosNum和JXTJ.yf均为汇总字段,即学校ID和月份
必须通过GridRowColumnValue()函数来获取交叉表汇总字段的内容。
水晶报表的相关资料在网上极少,以上一点小小的经验,也是花了很久时间搜索无果后自己研究出来的,特此记录,也希望给有同样需求的童鞋有所帮助。
首先看一下经典的JavaScript的继承机制。
定义一个名为BaseClass的类,然后为BaseClass定义两个函数:someMethod()和overridenMethod().
//do something
};
BaseClass.prototype.someMethod = function(){
//do something
};
BaseClass.prototype.overridenMethod = function(){
//do something
};
使用传统方式在JavaScript中实现类的继承操作
BaseClass.call(this);
};
SubClass.prototype = new BaseClass();
SubClass.prototype .newMethod = function(){
//do something
};
SubClass.prototype.overridenMethod = function(){
//do something
};
SubClass的构造函数中首先调用BaseClass的构造函数初始化数据,然后通过
SubClass.prototype = new BaseClass();
这条语句让SubClass类获得BaseClass中的所有属性和函数,从而实现了JavaScript中的继承操作,为子类添加了新函数而且覆盖了父类中的同名函数。
在ExtJS中使用Ext.extend()函数实现继承功能
SubClass.superclass.constructor.call(this);
};
Ext.extend(SubClass,BaseClass,{
newMethod: function(){};
overridenMethod: function(){};
};
Ext.extend()函数提供了直接访问父类构造函数的途径,通过SubClass.superclass.constructor.call(this);就可以直接调用父类的构造函数,这个函数的第一个参数总是this,以确保父类的构造函数在子类的作用域里工作。
如果父类的构造函数需要传入参数,可以讲所需的参数直接传递给它:
SubClass.superclass.constructor.call(this,config);这样就得到了一个继承了父类的所有属性和函数的子类。
Ext.apply函数的作用是将一个对象中的所有属性都复制到另一个对象中。
Ext.applyIf与Ext.apply的作用类似,区别在于如果某个属性在目标对象中已经存在,则Ext.applyIf不会将它覆盖。