到底谁是老千。。。
月度归档: 2010 年 2 月
《鼠来宝》
Microsoft.Office.Interop.Excel中Workbook.Close(false, Type.Missing, Type.Missing);保存总有保存提示框的问题。
问题描述:
近来做青岛自来水集团的项目,需要在Asp.Net中在服务器端修改Excel,功能实现了,但是发现,每次Workbook.Close(false, Type.Missing, Type.Missing);都会在服务器端弹出保存文件提示框。虽然Workbook.Save();实现保存了,但是每次还是弹出。
问题分析:
查了一些资料,可能是一个BUG。找了一个小时,终于在不起眼的网页上找到了解决方案。
问题解决:
因为在Workbook.Save();的时候没有把Workbook.Saved设置为true,导致了一只提示保存,两句语句可以解决该问题,如下:
Workbook.Saved = true;
Application.DisplayAlerts = false;
iPad界面设计基本规范
平台特点
1 大屏幕,分辨率 1024x768
2 再次强调没有固定的方向,必须四个方向都支持。
3 可以外接键盘
4 可以放置设备,与台式机同步
iPhone与iPad的共同特点
- 内存有限
- 同时运行单个程序
- 在设置功能里放置程序选项
- 设备方向可以改变
- 最小化的帮助,让用户直接就能看懂
- 程序响应手势而不是鼠标
- 运行源生程序、Web程序或者二者兼备
- 图片深度24位(RGB各8位),另带8位alpha通道,建议使用PNG格式图片
界面简单建议
- 支持所有方向
注意要为每个方向都提供一个启动图片
- 增强交互而非只增加功能
- 使用split view, 导航和弹出窗口来平整信息层级
- 减少全屏切换,仅仅改变需要改变的部分
- 支持协作和互联
- 如果可能,增加真实感以及物理维度到应用程序里,尽可能像真实世界的物品以便用户易于上手
- 界面漂亮 用户喜爱
- 尽量让用户更关注内容而不是界面
- 尽可能减少强制用户模式化操作
- 减少使用列表,改变为其他形式
- 尽量支持多手指手势
- 让用户模式化操作的地方可以用弹出窗口
- 限制复杂的模式化操作
- 减小文件操作尤其尽量让用户感觉不到文件系统的存在
- 仅仅在必须的情况才提示用户保存
- 将工具条整合在界面上部
- 尽可能快速启动程序
尽量使用截图作为启动画面
不要在启动时显示关于或者splash screen
恢复上次运行状态
尽量不要让用户提供设置信息
- 程序可能随时停止
- 为每个方向都准备启动画面
- 建立漂亮的图标
尺寸:72x72
和iPhone程序类似,iPad程序的图标会自动增加:圆角、阴影和高光。
图标标准:
> 90度直角边
> 没有高光
> 不带alpha通道透明
另外要提供48x48图标一个,用于spotlight搜索和设置
- 遵循已有规范
EXCEL工作表保护密码破解
方法:
1\打开文件
2\工具---宏----录制新宏---输入名字如:aa
3\停止录制(这样得到一个空宏)
4\工具---宏----宏,选aa,点编辑按钮
5\删除窗口中的所有字符(只有几个),替换为下面的内容:(复制吧)
6\关闭编辑窗口
7\工具---宏-----宏,选AllInternalPasswords,运行,确定两次,等2分钟,再确定.OK,没有密码了!!
内容如下:
Public Sub AllInternalPasswords()
' Breaks worksheet and workbook structure passwords. Bob McCormick
' probably originator of base code algorithm modified for coverage
' of workbook structure / windows passwords and for multiple passwords
'
' Norman Harker and JE McGimpsey 27-Dec-2002 (Version 1.1)
' Modified 2003-Apr-04 by JEM: All msgs to constants, and
' eliminate one Exit Sub (Version 1.1.1)
' Reveals hashed passwords NOT original passwords
Const DBLSPACE As String = vbNewLine & vbNewLine
Const AUTHORS As String = DBLSPACE & vbNewLine & _
"Adapted from Bob McCormick base code by" & _
"Norman Harker and JE McGimpsey"
Const HEADER As String = "AllInternalPasswords User Message"
Const VERSION As String = DBLSPACE & "Version 1.1.1 2003-Apr-04"
Const REPBACK As String = DBLSPACE & "Please report failure " & _
"to the microsoft.public.excel.programming newsgroup."
Const ALLCLEAR As String = DBLSPACE & "The workbook should " & _
"now be free of all password protection, so make sure you:" & _
DBLSPACE & "SAVE IT NOW!" & DBLSPACE & "and also" & _
DBLSPACE & "BACKUP!, BACKUP!!, BACKUP!!!" & _
DBLSPACE & "Also, remember that the password was " & _
"put there for a reason. Don't stuff up crucial formulas " & _
"or data." & DBLSPACE & "Access and use of some data " & _
"may be an offense. If in doubt, don't."
Const MSGNOPWORDS1 As String = "There were no passwords on " & _
"sheets, or workbook structure or windows." & AUTHORS & VERSION
Const MSGNOPWORDS2 As String = "There was no protection to " & _
"workbook structure or windows." & DBLSPACE & _
"Proceeding to unprotect sheets." & AUTHORS & VERSION
Const MSGTAKETIME As String = "After pressing OK button this " & _
"will take some time." & DBLSPACE & "Amount of time " & _
"depends on how many different passwords, the " & _
"passwords, and your computer's specification." & DBLSPACE & _
"Just be patient! Make me a coffee!" & AUTHORS & VERSION
Const MSGPWORDFOUND1 As String = "You had a Worksheet " & _
"Structure or Windows Password set." & DBLSPACE & _
"The password found was: " & DBLSPACE & "$$" & DBLSPACE & _
"Note it down for potential future use in other workbooks by " & _
"the same person who set this password." & DBLSPACE & _
"Now to check and clear other passwords." & AUTHORS & VERSION
Const MSGPWORDFOUND2 As String = "You had a Worksheet " & _
"password set." & DBLSPACE & "The password found was: " & _
DBLSPACE & "$$" & DBLSPACE & "Note it down for potential " & _
"future use in other workbooks by same person who " & _
"set this password." & DBLSPACE & "Now to check and clear " & _
"other passwords." & AUTHORS & VERSION
Const MSGONLYONE As String = "Only structure / windows " & _
"protected with the password that was just found." & _
ALLCLEAR & AUTHORS & VERSION & REPBACK
Dim w1 As Worksheet, w2 As Worksheet
Dim i As Integer, j As Integer, k As Integer, l As Integer
Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
Dim PWord1 As String
Dim ShTag As Boolean, WinTag As Boolean
Application.ScreenUpdating = False
With ActiveWorkbook
WinTag = .ProtectStructure Or .ProtectWindows
End With
ShTag = False
For Each w1 In Worksheets
ShTag = ShTag Or w1.ProtectContents
Next w1
If Not ShTag And Not WinTag Then
MsgBox MSGNOPWORDS1, vbInformation, HEADER
Exit Sub
End If
MsgBox MSGTAKETIME, vbInformation, HEADER
If Not WinTag Then
MsgBox MSGNOPWORDS2, vbInformation, HEADER
Else
On Error Resume Next
Do 'dummy do loop
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
With ActiveWorkbook
.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If .ProtectStructure = False And _
.ProtectWindows = False Then
PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
MsgBox Application.Substitute(MSGPWORDFOUND1, _
"$$", PWord1), vbInformation, HEADER
Exit Do 'Bypass all for...nexts
End If
End With
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
Loop Until True
On Error GoTo 0
End If
If WinTag And Not ShTag Then
MsgBox MSGONLYONE, vbInformation, HEADER
Exit Sub
End If
On Error Resume Next
For Each w1 In Worksheets
'Attempt clearance with PWord1
w1.Unprotect PWord1
Next w1
On Error GoTo 0
ShTag = False
For Each w1 In Worksheets
'Checks for all clear ShTag triggered to 1 if not.
ShTag = ShTag Or w1.ProtectContents
Next w1
If ShTag Then
For Each w1 In Worksheets
With w1
If .ProtectContents Then
On Error Resume Next
Do 'Dummy do loop
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If Not .ProtectContents Then
PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
MsgBox Application.Substitute(MSGPWORDFOUND2, _
"$$", PWord1), vbInformation, HEADER
'leverage finding Pword by trying on other sheets
For Each w2 In Worksheets
w2.Unprotect PWord1
Next w2
Exit Do 'Bypass all for...nexts
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
Loop Until True
On Error GoTo 0
End If
End With
Next w1
End If
MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK, vbInformation, HEADER
End Sub
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
问题描述:
用ASP.NET进行Excel服务器端操作的时候,出现如下错误:
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
问题分析:
可能是权限问题,文件权限没有问题,可能是WEB调用COM组件权限问题。
问题解决:
1:在服务器上安装office的Excel软件.
2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"
3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"
4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应
用程序属性"对话框
5:点击"标识"标签,选择"交互式用户"
6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加
一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.
7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK
SERVICE"用户,然后赋予"本地访问"权限.
这样,我们便配置好了相应的Excel的DCOM权限.
注意:这是在WIN2003上配置的,在2000上,可能是配置ASPNET用户
由于EXCEL是在服务器上打开的,所以应该写一个把导出数据保存在服务器上,然后再传递给客户端的方法,最后每次调
用这个功能的时候再删除以前在服务器上所生成的所有Excel
---------------------------------------------------------------------------------------------------------
另附一个解决方案:
在创建 EXCEL 应用程序时出现错误:
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
解决办法: 配置 DCOM 中 EXCEL 应用程序:
要在交互式用户帐户下设置 Office 自动化服务器,请按照下列步骤操作:
1. | 以管理员身份登录到计算机,并使用完整安装来安装(或重新安装)Office。为了实现系统的可靠性,建议您将 Office CD-ROM 中的内容复制到本地驱动器并从此位置安装 Office。 |
2. | 启动要自动运行的 Office 应用程序。这会强制该应用程序进行自我注册。 |
3. | 运行该应用程序后,请按 Alt+F11 以加载 Microsoft Visual Basic for Applications (VBA) 编辑器。这会强制 VBA 进行初始化。 |
4. | 关闭应用程序,包括 VBA。 |
5. | 单击开始,单击运行,然后键入 DCOMCNFG。选择要自动运行的应用程序。应用程序名称如下所示:
Microsoft Access 97 - Microsoft Access 数据库
Microsoft Access 2000/2002 - Microsoft Access 应用程序 Microsoft Excel 97/2000/2002 - Microsoft Excel 应用程序 Microsoft Word 97 - Microsoft Word Basic Microsoft Word 2000/2002 - Microsoft Word 文档 单击属性打开此应用程序的属性对话框。 |
6. | 单击安全选项卡。验证使用默认的访问权限和使用默认的启动权限已选中。 |
7. | 单击标识选项卡,然后选择交互式用户。 |
8. | 单击确定,关闭属性对话框并返回主应用程序列表对话框。 |
9. | 在 DCOM 配置对话框中,单击默认安全性选项卡。 |
10. | 单击访问权限的编辑默认值。验证访问权限中是否列出下列用户,如果没有列出,则添加这些用户:
SYSTEM
INTERACTIVE Everyone Administrators IUSR_<machinename>* IWAM_<machinename>* * 这些帐户仅在计算机上安装了 Internet Information Server (IIS) 的情况下才存在。 |
11. | 确保允许每个用户访问,然后单击确定。 |
12. | 单击启动权限的编辑默认值。验证启动权限中是否列出下列用户,如果没有列出,则添加这些用户:
SYSTEM
INTERACTIVE Everyone Administrators IUSR_<machinename>* IWAM_<machinename>* * 这些帐户仅在计算机上安装有 IIS 的情况下才存在。 |
13. | 确保允许每个用户访问,然后单击确定。 |
14. | 单击确定关闭 DCOMCNFG。 |
VS2008水晶报表发布部总结
一、 安装运行时支撑文件
如果你安装了VS2008,那么可以找到如下目录:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5
此目录下有如下文件:
COPY到服务器上根据服务器CPU情况选择性地安装一下。
二、 将WEB项目打包成安装程序
1. 在WEB解决方案中新建一个项目,选择项如下:
2. 右键点击项目名称,选择“视图”-“文件系统”
3. 按下图操作:
4. 设置项目的启动文件:
5. 在项目名称上右击,按下图操作,选“项目输出”:
6. 选“内容文件”后再“确定”:
7. 按SHIFT+F6即可生成安装文件,可以在项目的目录下能找到如下结果文件:
Copy这个MSI文件到服务器上安装完就可以浏览了。
三、 修补水晶报表的图标显示和打印功能
问题:如上所述,是可以浏览了,但是报表显示的工具栏上图标出不来:如下:
看到吗,小图标出不来。其它你再试试,打印也没法选打印机的。
解决办法:
1. 在自己开发的PC上找到如下目录:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NETClientFiles\CrystalReportWebFormViewer4
注意:CrystalReportWebFormViewer4中的4有可能与你的不一样,无所谓的。
2. 将CrystalReportWebFormViewer4目录复制到你的WEB服务器上项目所在目录中,如:
C:\???????\aspnet_client\system_web\2_0_50727\CrystalReportWebFormViewer4
再试试看吧,问题解决!
祝好运!
MARK
一些图片没有下来,留下地址
http://blog.sina.com.cn/s/blog_4dde37650100b9ey.html
前几天用VS2005做了个简单的医务系统的演示程序,B/S模式的,里面用到了水晶报表,说实话,这还是我第一次用水晶报表,看了看帮助就开始做,还算是顺利吧,以为是演示用,要求不太高.做完了就发布,然后就把程序给人家了,结果到了人家那水晶报表那块不能看!他说水晶报表发布的时候需要考几个库,VS 发布的时候不能自己把dll文件打包放到里面去,我就把那两个文件(CRDesigner.dll,crvspackage.dll,放在VS安装目录的 Crystal Reports文件夹里)给人家考了过去,结果还是不行,后来上网查说需要Crystal Reports 合并模块,从网上down了一个,做一个了安装程序把它装上了也行不通,没办法回来了。
今天参看以下帮助文件,说合并模块可以到http://www.businessobjects.com/products/dev_zone/net/2005.asp去下载,地址是假的,转到msdn上了。我想合并模块可能不行了,我就开始找Crystal Reports for .NET Framework 2.0 Windows 安装程序,结果发现VS2005的安装目录里已经有这些东西了,Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages这个文件夹里有好多东西,不光是水晶报表,还有框架,中文包,MDAC2.8以前不知道部署的时候还得从网上down这些东西,现在不用了!
从CrystalReports里把水晶报表装上就可以了!CRRedist2005_x86.msi/CRREdist2005_x86_chs.msi 这两个文件在MSDN里也有描述,下面是摘自MSDN
"如果添加的合并模块多于方案中指定的数目,可能会引起部署问题。将合并模块文件保存在计算机上的 C:\Program Files\Common Files\Merge Modules "
2005需要的合并模块式CrystalReportsRedist2005_X86.msm这个文件夹里没有!
还好问题解决了!
2008
-------------------------------
在安装有vs2008的电脑中,找到以下文件夹:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5。
将该文件夹下的CRRedist2008_x86.msi,安装到在要部署的机器上即可。