让IE6/7/8支持CSS3 media print(Media Queries)打印样式

某个项目需要支持打印样式,测试下来Chrome和FireFox正常,唯独IE8无法应用打印样式,也就是说识别不了@media定义的CSS样式节。

网上解决的办法也五花八门,我在这里整理一下,首先我们还是要从让IE支持media的的思路开始,首先JavaScript大将出马。

1. 项目css3-mediaqueries-js

该项目由Wouter van der Graaf发起(项目地址),旨在为了提供对于类似于IE 5+Firefox 1+Safari 2低版本浏览器的Media Queries支持,使用方式也很简单,直接引用脚本即可,当然现在基本上非IE的浏览器和IE9及以上版本已经原生支持Media Queries了,所以我们可以使用IE特有的条件注释处理代码引用,比如下面的代码示例:

继续阅读

VBScript利用WMI改变默认打印机实现指定打印机打印

之前我有篇文章《VBScript实现Word和Excel的打印》介绍了VBScript或者VBA实现Word和Excel的打印,基本上可以了解,其打印所要调用的是PrintOut方法,但是实际操作后发现其调用的是预先设置的默认打印机,有没有一种办法指定某种特定打印机进行打印呢?

非常遗憾的是,我没能找到较好的办法去解决这个问题,当然如果你知道的话可以与大家分享一下。经过一番搜索,发现微软脚本专家的《如何将文本文件打印到默认打印机之外的打印机?》这篇文章提出了一个变通的办法,大家可以尝试一下,具体的做法就是,先将所指定的打印机设为默认打印机,然后调用比如PrintOut打印,打印结束后,再将设置改回。

具体的代码摘录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
strComputer = "."
 
Set objWMIService = GetObject("winmgmts:\\" &_
  strComputer & "\root\cimv2")
 
' 下面检索当前的默认打印机
Set colPrinters =  objWMIService.ExecQuery _
  ("Select * from Win32_Printer Where Default = TRUE")
 
' 将\变为转义\\
For Each objPrinter in colPrinters
  strOldDefault = objPrinter.Name
  strOldDefault = Replace(strOldDefault, "\", "\\")
Next
 
' 找到我们所指定的打印机
Set colPrinters =  objWMIService.ExecQuery _
  ("Select * from Win32_Printer Where " &_
  "Name = '\\\\atl-ps-01\\printer2'")
 
For Each objPrinter in colPrinters
  objPrinter.SetDefaultPrinter() ' 设为默认
Next
 
WScript.Sleep 2000
 
' 执行打印的操作
' .PrintOut
 
' 还原原先的默认打印机
Set colPrinters =  objWMIService.ExecQuery _
  ("Select * from Win32_Printer Where Name = '" &_
   strOldDefault & "'")
 
For Each objPrinter in colPrinters
  objPrinter.SetDefaultPrinter()
Next

上述代码不难理解,只是为什么要转义一次,主要是因为WMI查询必须考虑类JavaScript或者C语言那样的转义字符,脚本专家上这样解释的:

为什么呢?是这样,如果默认打印机恰好为网络打印机,它将具有类似下面的名称:\\atl-ps-01\printer1。这并没有什么问题,只是稍后我们需要在脚本的 WQL Where 子句中使用该打印机名称。由于 \ 为保留字符,因此我们必须通过使用两个 \ 字符来“转义”每个 \ 字符;换句话说,我们的打印机(用于 Where 子句)的名称必须为 \\\\atl-ps-01\\printer1。我们使用 VBScript 的 Replace 函数来用一对 \ 替换打印机名称中的每个 \。

END

VBScript实现Word和Excel的打印

只要是安装了Microsoft Office的Word和Excel电脑,微软都为我们提供了Word和Excel的COM组件,方便我们以COM对象访问的形式操纵Word或Excel文件,今天介绍个小功能,那就是打印。

首先是Word的打印,基本上的流程就是创建Word.Application对象,然后调用Documents.Open的方式打开doc文件,然后执行PrintOut方法打印文件,然后Close关闭,最后退出并销毁Word.Application对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Option Explicit
 
Const MSWORD_FILENAME = "Word文件路径"
Sub VBMain()
  Dim wdApp, Doc
  Set wdApp = WSH.CreateObject("Word.Application")
  wdApp.Visible = False
  Set Doc = wdApp.Documents.Open(MSWORD_FILENAME)
  Doc.PrintOut
  Doc.Close
  Set Doc = Nothing
  wdApp.Visible = True
  wdApp.Quit
  Set wdApp = Nothing
End Sub
 
Call VBMain()
WSH.Quit()

最后介绍下Excel的打印,同样的道理,创建对象,打开要打印的工作簿,选择要打印的工作表,打印,然后关闭工作表,退出并销毁对象。同样的一些操作可以参考Excel的VBA手册《Microsoft Excel Visual Basic参考》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Option Explicit
 
Const MSEXCEL_FILENAME = "Excel文件路径"
Sub VBMain()
  Dim xlApp, WorkBooks, Sheet
  Set xlApp = WSH.CreateObject("Excel.Application")
  xlApp.Visible = False
  Set WorkBooks = xlApp.Workbooks.Open(MSEXCEL_FILENAME)
 
  Set Sheet = WorkBooks.Worksheets(1)  '打开第一个工作表
  ' 也可以打开上次保存时打开的活动工作表
  ' Set Sheet = WorkBooks.ActiveSheet  打开活动的工作表
  Sheet.PrintOut
  Set Sheet = Nothing
 
  WorkBooks.Close
  Set WorkBooks = Nothing
  xlApp.Quit
  Set xlApp = Nothing
End Sub
 
Call VBMain()
WSH.Quit()

对于想批量打印的朋友可以参考我这篇文章《采用插件机制的批量文件扫描及进程处理工具》