2009-03-26 45 views
5

Các mã sau ném một ngoại lệ trong Powershell V1 (Excel 2007):ngoại lệ tự động hoá Excel 2007 với Powershell khi gọi Workbooks.Add()

$E = New-Object -COM "Excel.Application" 
$E.Visible = $True 
$wb = $E.Workbooks.Add() #<<<Exception here 

Lỗi nói rằng định dạng có thể là cũ hoặc loại thư viện không hợp lệ (được dịch từ tiếng Tây Ban Nha). Một kịch bản tương tự cho Word hoạt động tốt.

+0

Phương thức Thêm có phải là một trong số đó có số lượng tham số tùy chọn lớn không? Nếu đó là trường hợp, sau đó bạn có thể phải cung cấp Type.EmptyType hoặc bất cứ điều gì nó được. Tra cứu cách gọi nó từ C# (không hỗ trợ tham số tùy chọn cho đến v4.0). –

+0

Theo kinh nghiệm của tôi, tùy thuộc vào phiên bản Office không cần sử dụng kiểu Thiếu cho các tham số tùy chọn, nhưng ví dụ Word 2007 yêu cầu đối số được chuyển thành [ref] trong PS, trái ngược với Office XP chẳng hạn. – guillermooo

Trả lời

3

Thích nghi với Powershell từ một trong các giải pháp được đề xuất trong MS Help and Support Article 320369.

$ci = new-object system.globalization.cultureinfo "en-US" 

$e = New-Object -COM "Excel.Application" 
$e.Visible = $True 
$e.UserControl= $True 
$books = $e.Workbooks 
$books.PSBase.GetType().InvokeMember(` 
     "Add", ` 
     [system.reflection.bindingflags]::InvokeMethod, ` 
     $null, $books, $null, $ci) 

Từ cùng một bài viết:

Khi bạn sử dụng một trong những cách giải quyết cho một máy tính mà các thiết lập khu vực không phù hợp với phiên bản ngôn ngữ hiện tại của Office, bạn nên làm quen với cách Excel hoạt động và cách Excel sẽ giải thích dữ liệu có thể được định dạng cho một ngôn ngữ cụ thể.

9

Hội đồng interop văn phòng dường như có vấn đề này khi văn hóa hiện tại không phải là en-US. Cách giải quyết rõ ràng là đặt văn hóa.

Điều quan trọng là chạy toàn bộ điều dưới dạng một lệnh trên bảng điều khiển tương tác, vì PowerShell V1 luôn tạo một chuỗi mới cho mỗi lệnh gọi.

PS C:\Users\jachymko> $e = new-object -com excel.application 
PS C:\Users\jachymko> $e.workbooks.add() 
Exception calling "Add" with "0" argument(s): "Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))" 
At line:1 char:17 
+ $e.workbooks.add <<<<() 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ComMethodTargetInvocation 

PS C:\Users\jachymko> & { 
>> [threading.thread]::CurrentThread.CurrentCulture = 'en-US' 
>> $e = new-object -com excel.application 
>> $e.workbooks.add() 
>> $e.visible=1 
>> } 
>> 
+0

Tôi sẽ thử lại sau, nhưng tôi nghĩ PSV1 chỉ sử dụng một quy trình và chỉ một luồng? ... – guillermooo

+0

PowerShell sử dụng một chuỗi thực thi duy nhất cho mỗi lần chạy một lúc, nhưng chuỗi thoát sau mỗi lệnh và được bắt đầu lại cho cai tiêp theo. Tôi tin rằng điều này có thể được kiểm soát trong V2 bằng cách sử dụng các API lưu trữ (bạn có thể làm cho nó sử dụng các thread gọi hoặc tái chế các thread chuyên dụng giữa các lệnh) –

+0

Giải pháp của bạn dường như không làm việc cho tôi ... Tôi tiếp tục nhận được lỗi tương tự. – guillermooo

2

Tôi gặp sự cố này khi cố gắng mở sổ làm việc. Tôi đã thêm dòng này:

[threading.thread]::CurrentThread.CurrentCulture = 'en-US' 
Các vấn đề liên quan