导出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”,确定保存。

 

posted @ 2011-11-22 21:30 Allen Zhang 阅读(42) 评论(0) 编辑

因为要动态填加表格行,于是我用了jquery下的append(text)函数,为了代码排版美观,我在里面加入了相应的空格,因此引来了一场悲剧。

$("#tableId").append(" <tr><td>&nbsp;</td></tr> ");

以上语句在IE8、Chrome等浏览器下正常工作,但是在IE6下不正确,点击添加行时无效,也没有提示错误。

绕了一个大圈,查了很多地方,甚至将jquery升级为最新版本都不能解决问题。

后来无意中将代码里面用于排版的空格去掉,奇迹就这么发生了,问题解决,真是坑爹啊。

正确的代码为: 

 $("#tableId").append("<tr><td>&nbsp;</td></tr>");


posted @ 2011-11-22 13:31 Allen Zhang 阅读(31) 评论(0) 编辑

在Web系统中调用Excel操作后,关闭Excel进程是个老问题

试了几种方法都无效,最后还是得采用kill进程的方案,不过跟强行kill所有Excel进程相比,下面的方案更为合理。

程序只kill当前对象相应的Excel进程。

 

[DllImport("user32.dll", SetLastError = true)]
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。

posted @ 2011-10-31 00:00 Allen Zhang 阅读(24) 评论(0) 编辑

C++           输入输出    C# 
==================================
char chr[255]   O    StringBuilder
KCA_DIR            I    int
LPCSTR             I    string
int                        I    int
LPSTR              O    StringBuilder
int*                      O    out int
DWORD              I    int
DWORD*          O    out int
BOOL                 I    bool
Rc_DBMgr          I    IntPtr
long*                  O    out long

 

 

API与C#的数据类型对应关系表
API数据类型类型描述C#类型API数据类型类型描述C#类型
WORD16位无符号整数ushortCHAR字符char
LONG32位无符号整数intDWORDLONG64位长整数long
DWORD32位无符号整数uintHDC设备描述表句柄int
HANDLE句柄,32位整数intHGDIOBJGDI对象句柄int
UINT32位无符号整数uintHINSTANCE实例句柄int
BOOL32位布尔型整数boolHWM窗口句柄int
LPSTR指向字符的32位指针stringHPARAM32位消息参数int
LPCSTR指向常字符的32位指针StringLPARAM32位消息参数int
BYTE字节byteWPARAM32位消息参数int

 

 

Wtypes.h 中的非托管类型

非托管 C 语言类型

托管类名

说明

HANDLE

void*

System.IntPtr

32 

BYTE

unsigned char

System.Byte

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 

posted @ 2011-10-17 15:56 Allen Zhang 阅读(33) 评论(0) 编辑

假设我们有这样一个需求,我要拿到所有培训学校,每个月培训人数,如下图的交叉统计表

交叉表在水晶报表中的实现非常简单,这里不再说明。

好,现在需求来了,客户要求可以看到各个培训学校每个月的培训学员名单。

此时我们就需要加入一个超级链接到上面的交叉表中,当用户点击其中一格统计数字时,能跳到另一个学员清单的界面。而在链接中我们需要把培训学校的ID和月份ID作为参数传到新页面。
链接制作方法:
在水晶报表设计界面,如下图的“合计”单元格中点右键,选择“设置对象格式”


在出现的窗口中选择“超级链接”选项卡

选择“Internet上的网站”,然后删除“网站地址”中内容,再点击右边红圈中的图标进入公式工作室



这里就是本文的重点,如何在链接中使用交叉表的汇总字段值,如培训学校ID和月份,
如果我们简单的将“报表字段”中内容拖入编辑框中,我们最终得到的结果是所有链接的所有值都是相同的,不会随着行列的变化发生变化。
示例公式:

"/Reports/myRpt.aspx?jxId="+ CStr(GridRowColumnValue("JXTJ.ds_BosNum"),"#"+"&nf="+ CStr({JXTJ.nf},"#"+ "&yf="+ Cstr(GridRowColumnValue("JXTJ.yf"),0+"&flag="+ {JXTJ.flag}

 公式中的JXTJ.ds_BosNumJXTJ.yf均为汇总字段,即学校ID和月份
必须通过GridRowColumnValue()函数来获取交叉表汇总字段的内容。

水晶报表的相关资料在网上极少,以上一点小小的经验,也是花了很久时间搜索无果后自己研究出来的,特此记录,也希望给有同样需求的童鞋有所帮助。

 

posted @ 2010-06-11 01:30 Allen Zhang 阅读(201) 评论(0) 编辑

首先看一下经典的JavaScript的继承机制。

定义一个名为BaseClass的类,然后为BaseClass定义两个函数:someMethod()和overridenMethod().

var BaseClass = function(){
//do something
};
BaseClass.prototype.someMethod 
= function(){
//do something
};
BaseClass.prototype.overridenMethod 
= function(){
//do something
};

使用传统方式在JavaScript中实现类的继承操作

var SubClass = function(){
   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()函数实现继承功能

var SubClass = function(){
    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不会将它覆盖。

 

posted @ 2009-10-25 21:14 Allen Zhang 阅读(506) 评论(0) 编辑
摘要: 由于服务器意外的断电,导致SQL SERVER服务器上数据库出现“置疑”而无法使用,通过网上搜索,找到以下方法解决问题,这里记录一下:产生数据库置疑的时侯,数据库文件和日志文件都是存在的,如果数据库文件都不存在了,则要另当处理。1、停止数据库服务器,将数据库MDF文件和LDF文件复制备份一份2、启动数据库服务器,删除置疑的数据库3、仅用备份的数据库MDF文件附加数据库,sp...阅读全文
posted @ 2009-10-09 10:52 Allen Zhang 阅读(361) 评论(0) 编辑
摘要: 在Web项目中经常要用到打印功能,我现在使用的是ScriptX,基本功能是免费的(高级功能收费)在网页中嵌入:<object id="factory" viewastext style="display:none" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" codebase="hppt://url/smsx.cab#Versio...阅读全文
posted @ 2009-08-30 21:21 Allen Zhang 阅读(436) 评论(0) 编辑
摘要: 当我们的内网Web服务器需要访问外网的一个Web服务,但是我们的网络是通过代理服务器才能上网的。我们就需要告诉asp.net应用程序代理服务地址和端口。实现方法是在Web.config的configuration配置节中增加以下配置项[代码]其中几个参数说明:bypassonlocal:本地地址访问是否不使用代理服务器,true为本地地址不使用代理访问proxyaddress:代理服务器地址和端口...阅读全文
posted @ 2008-12-12 11:23 Allen Zhang 阅读(193) 评论(1) 编辑
摘要: 使用JQuery进行表单验证,aspx部分代码如下:[代码]以上代码运行后,当我们点击“确定”按钮,页面发生PostBack,但是并没有引发“确定”按钮的事件处理程序。我去掉上面的JQuery的代码,事件就可以引发。经过分析得出原因:JQuery的Form Validate plugin,在实际提交时并不提交Input type为button的值,所...阅读全文
posted @ 2008-12-11 10:37 Allen Zhang 阅读(549) 评论(0) 编辑